這裏的想法(我認爲)是,有人創造,保持參照光標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'])
我省略了一些的錯誤處理/重新連接到數據庫的代碼,如果連接已經下降,但總體思路就在那裏。這樣,遊標就會在需要,使用和允許超出範圍時創建,讓我集中處理錯誤。
我不認爲你需要設置'run_sql_command.c = c'。也許代碼的作者不明白c仍然可以被內部函數訪問。 – rlotun