我在网上找到了以下内容,但是从我与Python的小小曝光中我知道可以将功能附加到对象中。我也知道Python中的所有东西都是对象。我还没有理解下面打算实现的目的及其用例。 这是我需要帮助的部分:
run_sql_command.c = c
def get_sql_object(c):
def run_sql_command(command, arguments=[]):
c.execute(command, arguments)
return c.fetchall()
run_sql_command.c = c
return run_sql_command
答案 0 :(得分:3)
这里的想法(我相信)是有人正在创建一个占位符对象,该对象继续引用游标c
,以便以后可以用它来执行查询。建议用法可能是这样的:
c = DBConnectionObject.cursor()
myExecutor = get_sql_object(c)
# some amount of code later
rows = myExecutor(Queries.GetAllUsersByFName, ['Larry', 'Bob'])
- 解决一些意见 -
我发现尝试保留游标可能会在易失性环境中导致问题,因为并不总是保证数据库连接保持连接。我选择这种方法:
class DBConnection(object):
def __init__(self, dbpath):
self.dbPath = dbpath
# Any connection object here, really.
self._conn = kinterbasdb.connect()
def cursor(self, query, params = None):
try:
cursor = self._conn.cursor()
if params:
cursor.execute(query, params)
else:
cursor.execute(query)
return cursor
except (kdb.ProgrammingError, AttributeError), e:
print e
def qry(self, query, params = None):
cursor = self.cursor(query, params)
return [[x[0].title() for x in cursor.description]] + [r for r in cursor.fetchall()]
然后,您将创建一个全局数据库连接,如下所示:
dbcon = DBConnection('/path/to/mydb.fdb')
并使用以下命令运行查询:
rows = dbcon.qry(Queries.GetSomething)
或:
filtered = dbcon.qry(Queries.FilteredQuery, ['my', 'parameters'])
如果连接断开,我省略了一些错误处理/重新连接到数据库的代码,但总体思路就在那里。这样,游标在需要,使用和允许超出范围时创建,让我集中处理错误。
答案 1 :(得分:0)
我认为run_sql_command.c
可以保留对c的可访问引用,例如稍后关闭它。
答案 2 :(得分:0)
该行向函数c
添加属性run_sql_command
,为其提供传递给函数get_sql_object()
的值,可能是数据库游标。你可能已经知道了很多。
由于此代码段的范围有限,该语句完全没有用处。在更大的上下文中,可以在代码中的其他地方重用游标。在代码的其他部分中查找.c
属性的访问权限,看看它是如何完成的。