Python 在SELECT查询后,使SQLAlchemy提交而不是回滚
我正在与合作伙伴一起开发应用程序。我负责数据库部分(PostgreSQL),我的合作伙伴使用python在web服务器上使用SQLAlchemy实现该应用程序。我们大量使用存储过程。Python 在SELECT查询后,使SQLAlchemy提交而不是回滚,python,postgresql,transactions,sqlalchemy,commit,Python,Postgresql,Transactions,Sqlalchemy,Commit,我正在与合作伙伴一起开发应用程序。我负责数据库部分(PostgreSQL),我的合作伙伴使用python在web服务器上使用SQLAlchemy实现该应用程序。我们大量使用存储过程。选择查询数据库日志中如下所示: SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT col_a, col_b FROM f_stored_proc(E'myvalue'); ROLLBACK; 在存储过程中,我将某些输入写入日志表。应用程序通过SELEC
选择
查询数据库日志中如下所示:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT col_a, col_b FROM f_stored_proc(E'myvalue');
ROLLBACK;
在存储过程中,我将某些输入写入日志表。应用程序通过SELECT
进行查询,SQLAlchemy只看到SELECT语句并坚持执行回滚。日志记录失败。我需要它来提交
。我的搭档声称没有简单的方法,我们必须完全取消SQLAlchemy。我认为他一定是错了,但他没有足够的能力提出相反的主张
有没有一种简单的方法可以使SQLAlchemyCOMMIT
而不是ROLLBACK
?是什么阻止我只执行
trans.commit()
?我是否需要为此设置autoflush=False
我已经扫描了,但没有找到答案。搜索发现了一些相关问题,如和,但我不清楚。
也许这会起作用?如果您使用的是SQLAlchemy的连接池,那么您看到的可能是使用后连接关闭时发生的自动回滚。显然有必要保证连接在下次从池中拉出时“干净”。有关更多信息,请参阅;搜索顶部附近的“池机制” 据我回忆(我上次使用它已有几年了),将隔离级别更改为自动提交并不能解决问题,因为它不会将SELECT语句视为需要提交
您真的只想将该语句包装到事务中。我不知道您的代码是如何构造的,但您应该能够使用SQLAlchemy的connection.begin和connection.commit。您甚至可以将BEGIN和COMMIT作为任意SQL执行。您确定sqlalchemy真的是负责回滚的人吗?可能是您使用的框架在请求循环结束时自动回滚未受限制的会话吗?不完全确定,我必须询问我的合作伙伴。我想它正在使用中。但是,在这种情况下,我们不能只
COMMIT
来防止框架回滚吗?明确提交隔离事务或将隔离级别设置为零就足够了。我想问的是,如果您使用的是一个应用程序框架,如Pylons或Zope,它以某种方式为您管理数据库状态;在普通的python脚本中是否只使用sqlalchemy?每个会话
实例的生命周期是如何管理的?如果您可以发布SA使用情况下合作伙伴的相应代码,那就太好了。我的第一个猜测是甚至没有调用session.commit(),回滚来自连接池管理,以确保新请求的干净连接。