熊猫在to_sql之后打开了闲置的Postgres连接?

时间:2019-02-22 16:38:45

标签: python pandas postgresql sqlalchemy pandas-to-sql

我正在与Pandas和Postgres进行很多ETL。我有大量的空闲连接,其中许多标记有COMMITROLLBACK,但我不确定如何防止长时间处于空闲状态而不是关闭。我用来写入数据库的主要代码是使用熊猫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看起来像这样:

enter image description here

有人可以为我指出正确的方向,以避免将来如何避免这么多空闲连接吗?我们的某些数据库连接是连续的“批处理”过程,因此使用寿命长。但是似乎有些一次性事件使连接断开和空闲。

1 个答案:

答案 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