SQLAlchemy能识别存储过程却无法执行的问题求助
问题解决:SQLAlchemy调用PostgreSQL存储过程无报错但未生效
核心原因
SQLAlchemy使用engine.connect()创建的连接默认处于非自动提交事务模式,执行修改类操作(比如存储过程里的INSERT)后,需要手动提交事务才能将变更同步到数据库;而psql命令行默认是自动提交模式,所以执行后直接生效。
解决方案
以下三种方法任选其一:
方法1:手动提交事务
在执行存储过程后显式调用commit():
with engine.connect() as connection: connection.execute("CALL testSProc();") connection.commit() # 必须添加这行提交事务
方法2:使用engine.begin()自动提交
engine.begin()上下文管理器会自动管理事务,执行完成后自动提交:
with engine.begin() as connection: connection.execute("CALL testSProc();") # 无需手动调用commit,退出上下文时自动提交
方法3:用SQLAlchemy的text()包裹语句(推荐)
使用SQLAlchemy的text对象处理SQL语句,更符合框架规范,同样需要手动提交:
from sqlalchemy import text with engine.connect() as connection: connection.execute(text("CALL testSProc();")) connection.commit()
验证说明
你提到修改存储过程名称、去掉括号会触发错误,说明程序确实能正确识别并调用存储过程,只是事务未提交导致变更没写入数据库,按上述方法添加提交操作后即可解决问题。
内容的提问来源于stack exchange,提问作者Alex L
相关产品推荐
相关产品推荐

