有什么方法可以处理DB uri中的断开连接吗?

时间:2019-10-01 09:54:18

标签: python postgresql docker sqlalchemy psycopg2

我想知道是否有某种方法可以在数据库URI中设置pool_pre_ping,以便我不应该触摸实际的代码并使用某些SELECT[1]类型的conn检查?

在配置中,读取以下变量:

SQLALCHEMY_DATABASE_URI = f'postgresql+psycopg2://{user}:{pw}@db:5432/{db}'

我想添加pool_pre_ping设置,例如:

SQLALCHEMY_DATABASE_URI = f'postgresql+psycopg2://{user}:{pw}@db:5432/{db} [SOMETHING pool_pre_ping=True]'

需要设置pool_pre_ping的一个问题是,客户端偶尔会关闭数据库连接,而应用程序无法提供响应。在解决此问题的原始原因之前,我应防止在途中或其他情况下断开连接。我正在使用Docker容器。

如果您能给我一些提示,我非常感谢。谢谢:-)

2 个答案:

答案 0 :(得分:2)

最近在Flask-SQLAlchemy v2.4中更容易实现了这一点。

已专门添加了SQLALCHEMY_ENGINE_OPTIONS配置密钥,以使烧瓶应用程序中的create_engine的配置不那么严格(docs)。因此,在您的情况下,添加app.config["SQLALCHEMY_ENGINE_OPTIONS"] = {"pool_pre_ping": True}将达到您想要的目的。

或者(再次是2.4+),您可以将关键字参数的字典传递给engine_options构造函数(docs)的SQLAlchemy()参数,例如SQLAlchemy(app, engine_options={"pool_pre_ping": True})是等同于以上所述,除了这些值将与SQLALCHEMY_ENGINE_OPTIONS中定义的所有引擎设置合并并优先于它们。

答案 1 :(得分:0)

非常感谢!现在可以了:-)

我做了以下事情:

(我没有在URI中设置“ pool_pre_ping”,而是在代码中添加了几行)

从flask_sqlalchemy导入SQLAlchemy作为_NSQLAlc ...

SQLAlchemy(_NSQLAlc)类:     def apply_pool_defaults(self,app,options):         超级(SQLAlchemy,self).apply_pool_defaults(app,options)         options [“ pool_pre_ping”] =真

db = SQLAlchemy()