[英]Pandas leaving idle Postgres connections open after to_sql?
我和Pandas以及Postgres做了很多ETL。 我有很多空閑連接,很多都標有COMMIT
和ROLLBACK
,我不知道如何防止長時間閑置而不是關閉。 我用來寫入數據庫的主要代碼是使用pandas to_sql
:
def write_data_frame(self, data_frame, table_name):
engine = create_engine(self.engine_string)
data_frame.to_sql(name=table_name, con=engine, if_exists='append', index=False)
我知道這絕對不是PostgreSQL的最佳實踐,我應該做的事情就像將params傳遞給存儲過程或函數或其他東西,但這就是我們如何設置從非Postgres數據庫/數據源獲取data_frames並上傳到Postgres 。
我的pgAdmin看起來像這樣:
有人可以指出我在未來如何避免這么多空閑連接的正確方向嗎? 我們的一些數據庫連接意味着長期存在,因為它們是連續的“批處理”進程。 但似乎一些一次性事件正在使連接開放和閑置。
將engine
作為一次性使用可能並不適合您。 如果可能,您可以使引擎成為類的成員並將其稱為self.engine
。
另一種選擇是明確處理引擎。
def write_data_frame(self, data_frame, table_name):
engine = create_engine(self.engine_string)
data_frame.to_sql(name=table_name, con=engine, if_exists='append', index=False)
engine.dispose()
這具有完全關閉所有當前已檢入的數據庫連接的效果。 仍未檢出的連接將不會關閉,但是它們將不再與此引擎關聯,因此當它們單獨關閉時,最終與它們關聯的池將被垃圾收集並且它們將完全關閉,如果簽到時尚未關閉。
這也可能是try...except...finally
一個很好的用例try...except...finally
塊,因為.dispose
僅在前面的代碼執行時才會被調用而沒有錯誤。
我寧願建議你傳遞這樣的連接:
with engine.connect() as connection:
data_frame.to_sql(..., con=connection)
但是to_sql
文檔表明你不能這樣做,他們只會接受一個engine
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.