簡體   English   中英

在to_sql之后,Pandas離開了Postgres連接的空閑狀態?

[英]Pandas leaving idle Postgres connections open after to_sql?

我和Pandas以及Postgres做了很多ETL。 我有很多空閑連接,很多都標有COMMITROLLBACK ,我不知道如何防止長時間閑置而不是關閉。 我用來寫入數據庫的主要代碼是使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM