2011-09-07 97 views
1

我在網上找到了下面的內容,但是從我對Python的小小曝光中我知道可以將函數附加到對象中。我也知道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

我不認爲你需要設置'run_sql_command.c = c'。也許代碼的作者不明白c仍然可以被內部函數訪問。 – rlotun

回答

0

那行添加屬性c到功能run_sql_command,給它傳遞給函數get_sql_object(),想必數據庫光標值。你可能已經知道了很多。

由於該片段的範圍有限,該聲明根本沒有用處。在更大的上下文中,可以在代碼中的其他地方重新使用遊標。在代碼的其他部分查找對.c屬性的訪問,並查看完成的操作。

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']) 

我省略了一些的錯誤處理/重新連接到數據庫的代碼,如果連接已經下降,但總體思路就在那裏。這樣,遊標就會在需要,使用和允許超出範圍時創建,讓我集中處理錯誤。

+0

以上工作即使沒有創建佔位符 – user618677

+0

@ user618677 - 可能。我沒有爲這個片段辯解,只是試圖解釋它。我個人發現,保持光標不如其他方法有用。我會在一秒鐘之內粘貼在我的一個演示中。 –

0

我認爲run_sql_command.c是爲了保持對c的可訪問引用,稍後關閉它。