如何在Flask+SQLAlchemy 2.1中为PostgreSQL开启原生自动提交模式
解决方案
完全可以在当前版本限制下开启PostgreSQL原生自动提交,无需升级Flask-SQLAlchemy依赖,也无需修改现有依赖db对象的业务代码,有两种可选实现方案:
方案1:修改引擎默认执行选项(推荐)
直接在db初始化完成后修改引擎级别的隔离级别,该配置会作用于所有从连接池取出的连接,是PostgreSQL驱动层面的原生自动提交,无额外性能开销。
修改后的register_extensions函数代码如下:
def register_extensions(app): db.init_app(app) # 新增如下代码,设置引擎原生自动提交 db.engine = db.engine.execution_options(isolation_level="AUTOCOMMIT") with app.app_context(): db.create_all()
同时可以删除原来无效的session_options={'autocommit': True}参数和不生效的SQLALCHEMY_ENGINE_OPTIONS配置项。
方案2:数据库连接URI追加参数
如果不想修改初始化逻辑,也可以直接在数据库连接URI中添加psycopg2驱动的autocommit参数,驱动创建连接时会自动开启原生自动提交:
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://localhost/etc?autocommit=True'
配置验证方法
可以通过如下代码验证原生自动提交是否生效:
with app.app_context(): res = db.session.execute("SHOW autocommit").scalar() print(res) # 输出为on则代表原生自动提交已开启
显式事务使用方式
开启全局原生自动提交后,需要执行事务操作时,只需显式开启事务即可,不受全局自动提交配置影响:
# 增删改事务示例 with db.session.begin(): # 此处代码运行在显式事务中,出错会自动回滚 db.session.add(new_obj) db.session.delete(old_obj)
事务执行完成后,连接会自动回到默认的原生自动提交状态。
内容的提问来源于stack exchange,提问作者Kitserve
相关产品推荐
相关产品推荐

