我正在与合作伙伴一起开发应用程序。我做了数据库部分( PostgreSQL ),我的合作伙伴使用 SQLAlchemy 在python上实现了web服务器上的应用程序。我们大量使用存储过程。其中一个查询的SELECT
查询在db日志中如下:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT col_a, col_b FROM f_stored_proc(E'myvalue');
ROLLBACK;
在存储过程中,我将某些输入写入日志表。应用程序按SELECT
进行查询,SQLAlchemy只能查看SELECT语句并坚持使用ROLLBACK
。记录失败。我需要COMMIT
代替它。我的合作伙伴声称没有简单的方法,我们必须完全删除SQLAlchemy。我认为他一定是错的,但缺乏其他方面的要求。
是否有一种简单的方法可以使SQLAlchemy COMMIT
代替ROLLBACK
?
是什么阻止我执行trans.commit()
?我需要为此设置autoflush=False
吗?
我扫描了FAQ,但没有在那里找到答案 搜索SO会显示一些相关问题,例如here和here,但我并不清楚 也许这recipe可行吗?
答案 0 :(得分:4)
如果您正在使用SQLAlchemy的连接池,那么您所看到的可能是在使用后关闭连接时发生的自动回滚。显然有必要保证连接是“干净的”。下次它被拉出游泳池。有关详细信息,请参阅this page;寻找汇集机制'靠近顶部。
据我记得(自从我上次使用它以来已经过了几年)将隔离级别更改为自动提交不会解决问题,因为它不会看到SELECT语句需要提交。
您真的只想在事务中包装该语句。我不知道你的代码是如何构建的,但是你应该能够使用SQLAlchemy的connection.begin和connection.commit。您甚至可以将BEGIN和COMMIT作为任意SQL执行。