SQLalchemy:Engine/Connection 闲置数小时后断开连接

SQLalchemy: Engine/Connection disconnects after some hours of inactivity

情况

我在 docker 容器中有一个 plotly-dash 应用程序 运行(基于 python3.7-slim)。 该应用程序正在访问 postgres 数据库并可视化查询的数据。

但是,如果该应用程序有一段时间未使用(我估计大约 24-48 小时。我们在周末没有人使用该应用程序后的星期一首先注意到此问题)即如果没有查询数据从数据库中,应用程序冻结并且日志显示一些与数据库相关的错误。

我无法完全访问日志,但它们包含以下错误:

AttributeError: 'Connection' object has no attribute '_Connection_connection'

下面列出了所有试图从数据库中查询数据的代码片段(但没有说明到底出了什么问题)。

问题总是通过重新启动应用程序解决(因此与数据库建立新连接)

假设

如上所述,这种情况总是 在一段时间不活动后发生。所以我的假设是,引擎在空闲时间后断开连接

代码示例

为了访问数据库,我有一个DatabaseConnection class。代码的相关部分包含如下内容:

from sqlalchemy import create_engine

...

engine = create_engine(f"postgresql+psycopg2://{user}:{passw}@{url}:{port}/{db_name}")
self.engine = engine.connect()

...

问题

如果您需要更多信息,请告诉我。提前致谢。

我的代码有错误。应该是

self.engine = create_engine(f"postgresql+psycopg2://{user}:{passw}@{url}:{port}/{db_name}")

第二行应该省略。我误解了 engine.connect() 在做什么:它 returns 一个 Connection 对象( 不是 引擎,正如属性名称所暗示的那样)。

然后,对于我执行的每个查询,我使用这样的上下文管理器:

with self.engine.connect() as conn
  table1 = pd.read_sql_table("table1", con=conn)

这样,Connection 对象在使用后关闭。但引擎对象可能会在必要时打开新连接。

在我之前的解决方案中,连接在空闲时间后被终止。

(基于此GitHub Discussion