我正在与Pandas和Postgres进行很多ETL。我有大量的空闲连接,其中许多标记有COMMIT
和ROLLBACK
,但我不确定如何防止长时间处于空闲状态而不是关闭。我用来写入数据库的主要代码是使用熊猫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的最佳实践,我应该做一些类似将参数传递给存储过程或函数之类的事情,但这就是我们设置如何从非Postgres数据库/数据源获取data_frames的方式。上传到Postgres。
我的pgAdmin看起来像这样:
有人可以为我指出正确的方向,以避免将来如何避免这么多空闲连接吗?我们的某些数据库连接是连续的“批处理”过程,因此使用寿命长。但是似乎有些一次性事件使连接断开和空闲。
答案 0 :(得分:2)
一次性使用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()
如the docs中所述,
这具有完全关闭所有当前已检查的数据库连接的作用。仍被检出的连接将不会关闭,但是将不再与该引擎关联,因此,当单独关闭它们时,最终,与之关联的池将被垃圾回收,并且如果被关闭,则将其完全关闭。签到时尚未关闭。
这对于try...except...finally
块也是一个很好的用例,因为.dispose
仅在前面的代码无错误执行时才会被调用。
我宁愿建议您像这样通过连接:
with engine.connect() as connection:
data_frame.to_sql(..., con=connection)
但是to_sql
文档表明您不能这样做,他们只会接受engine