【问题标题】:Pandas leaving idle Postgres connections open after to_sql?在 to_sql 之后打开空闲 Postgres 连接的熊猫?
【发布时间】:2019-07-16 19:23:52
【问题描述】:

我正在用 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 的最佳实践,我应该做一些事情,比如将参数传递给存储过程或函数或其他东西,但这就是我们设置从非 Postgres 数据库/数据源获取 data_frames 的方式和上传到 Postgres。

我的 pgAdmin 看起来像这样:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 看起来更好。非常感谢。
    猜你喜欢
    • 2021-08-10
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2013-10-15
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多