2011-12-29 101 views
2

我正在編寫一個需要與多個數據庫(不是同時)交互的腳本。爲了促進這一點,我在字典中維護數據庫相關信息(連接等)。另外,我使用sqlAlchemy進行與db的所有交互。我不知道這是否與這個問題有關。創建池對象(Python)

我有一個函數來設置池。它看起來有點像這樣:

def setupPool(): 
    global pooled_objects 

    for name in NAMES: 
     engine = create_engine("postgresql+psycopg2://postgres:[email protected]/%s" % name) 
     metadata = MetaData(engine) 
     conn = engine.connect() 
     tbl = Table('my_table', metadata, autoload=True) 
     info = {'db_connection': conn, 'table': tbl } 

     pooled_objects[name] = info 

,我不知道是否有在上面的代碼中任何陷阱,因爲我使用的是相同的變量名,而其並不清楚(我ATLEAST),如何將潛在的指針到資源(連接正在處理)。例如,將創建另一個引擎(到不同的數據庫)並將其分配給'引擎'變量會導致GC'收集'以前的實例(因爲沒有代碼正在使用該引用 - 池仍在安裝中)。

簡而言之,上面的代碼是OK嗎?如果不是,那麼爲什麼不 - 我是如何解決上述問題的?

回答

4

您擁有的代碼非常好。

只是因爲你使用相同的變量名並不意味着你重寫(或釋放)分配給該變量的另一個對象。其實你可以把名字看作臨時的標籤給你的對象。

現在,您將最終對象存儲在全局字典pooled_objects中,這意味着直到您的程序完成或您明確從中刪除數據,GC不會釋放它們。