我想知道是否有某种方法可以在数据库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容器。
如果您能给我一些提示,我非常感谢。谢谢:-)
答案 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()