2010-09-07 57 views
3

我正在Python中创建一个基本的数据库实用程序类。我正在将一个旧模块重构为一个类。我现在正在研究一个executeQuery()函数,我不确定是保留旧的设计还是改变它。这里有2种选择:Python中的设计问题:这应该是一个通用函数还是两个特定函数?

  1. (旧的设计:)有一个通用的executeQuery方法,它采用的查询执行和一个布尔commit参数,指示是否提交(插入,更新,删除)否(选择),并用if语句确定是否提交或选择并返回。
  2. (这是我习惯的方式,但可能是因为你不能有一个功能,有时会返回一些东西,有时并没有在语言,我曾与:)有2个功能,executeQueryexecuteUpdateQuery(或类似的东西)。 executeQuery将执行一个简单的查询并返回结果集,而executeUpdateQuery将更改数据库(插入,更新,删除)并返回任何内容。

是否接受使用第一种方式?对我来说似乎还不清楚,但也许它更蟒蛇......? Python是非常灵活的,也许我应该利用这种功能,这种功能不能用这种更严格的语言来完成......

而这个问题的第二部分,与主要思想无关 - 什么是在Python中返回查询结果的最佳方式是什么?使用哪个函数来查询数据库,以什么格式...?

+0

与您的主要问题无关,但如果您正在编写SQL后端的接口,则可以尝试尽可能严格地遵循DBAPI:http://www.python.org/dev/peps/ pep-0249/- 兼容DBAPI的模块可以更容易地集成到其他知道如何与数据库交谈的Python软件中。 – 2010-09-07 20:06:51

+0

'executeUpdate'可以返回受影响的行数。为了返回灵活的结果,你可以将row_factory_function传递给你的'executeQuery'。 – MattH 2010-09-07 20:12:37

回答

2

我不知道如何回答你的问题的第一部分,它似乎比风格更重要。也许你可以调用Single Responsibility Principle来争辩它应该是两个独立的功能。

当你将返回不确定长度的序列,这是最好使用Generator

2

我会有两个方法,一个更新数据库和一个没有。如果它们共享大量的代码,它们都可以委托给一个通用的私有方法。

两种方法分离,显然给调用者都有哪些不同的语义是在两者之间,使记录了不同的方法更简单,并阐明什么返回类型的期望。由于您可以将共享代码拖放到对象上的私有方法中,因此不必担心重复代码。

至于返回查询结果,这将取决于您要加载所有来自数据库的结果返回之前,或返回游标对象。我会试着做一些这样的:

with db.executeQuery('SELECT * FROM my_table') as results: 
    for row in results: 
     print row['col1'], row['col2'] 

...所以executeQuery方法返回一个ContextManager对象(如果需要的话它会清除所有打开的连接),这也可作为Generator。发生器的结果为只读dict s。

4

这propably只是我和我的FP迷信,但我认为只用于副作用执行的功能是从一个非破坏性的功能,其获取的一些数据非常不同,因此有不同的名称。特别是如果通用函数会根据不同的情况做不同的事情(commit参数的部分似乎暗示了这一点)。

至于如何返回结果...我是一个巨大的发电机爱好者,但是如果你用于数据库连接的库无论如何都会返回一个列表,那么你不妨通过这个列表 - 在这种情况下发电机不会为你购买任何东西。但是,如果它允许您迭代结果(一次一个),则抓住机会在较大的查询上节省大量内存。

相关问题