在SELECT查询之后,使SQLAlchemy COMMIT而不是ROLLBACK

时间:2011-09-26 18:31:34

标签: python postgresql transactions sqlalchemy commit

我正在与合作伙伴一起开发应用程序。我做了数据库部分( 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会显示一些相关问题,例如herehere,但我并不清楚 也许这recipe可行吗?

1 个答案:

答案 0 :(得分:4)

如果您正在使用SQLAlchemy的连接池,那么您所看到的可能是在使用后关闭连接时发生的自动回滚。显然有必要保证连接是“干净的”。下次它被拉出游泳池。有关详细信息,请参阅this page;寻找汇集机制'靠近顶部。

据我记得(自从我上次使用它以来已经过了几年)将隔离级别更改为自动提交不会解决问题,因为它不会看到SELECT语句需要提交。

您真的只想在事务中包装该语句。我不知道你的代码是如何构建的,但是你应该能够使用SQLAlchemy的connection.begin和connection.commit。您甚至可以将BEGIN和COMMIT作为任意SQL执行。