我对熊猫和博士后做了很多ETL。我有很多空闲的连接,很多标记为COMMITROLLBACK,我不知道如何防止长时间闲置而不是关闭。我用来写入数据库的主要代码是使用pandasto_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数据库/数据源获取数据帧并上传到Postgres的设置。
我的pgAdmin如下所示:
python -  Pandas 在to_sql之后打开空闲的Postgres连接吗?-LMLPHP
有人能给我指出一个正确的方向,在未来如何避免这么多的空闲连接?我们的一些数据库连接是长期的,因为它们是连续的“批处理”过程。但似乎有些一次性事件让连接处于打开和空闲状态。

最佳答案

一次性使用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

10-01 04:56
查看更多