[英]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.