繁体   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