Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在SELECT查询后,使SQLAlchemy提交而不是回滚_Python_Postgresql_Transactions_Sqlalchemy_Commit - Fatal编程技术网

Python 在SELECT查询后,使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

我正在与合作伙伴一起开发应用程序。我负责数据库部分(PostgreSQL),我的合作伙伴使用python在web服务器上使用SQLAlchemy实现该应用程序。我们大量使用存储过程。
选择
查询数据库日志中如下所示:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SELECT col_a, col_b FROM f_stored_proc(E'myvalue');

ROLLBACK;
在存储过程中,我将某些输入写入日志表。应用程序通过
SELECT
进行查询,SQLAlchemy只看到SELECT语句并坚持执行
回滚。日志记录失败。我需要它来提交
。我的搭档声称没有简单的方法,我们必须完全取消SQLAlchemy。我认为他一定是错了,但他没有足够的能力提出相反的主张

有没有一种简单的方法可以使SQLAlchemy
COMMIT
而不是
ROLLBACK

是什么阻止我只执行
trans.commit()
?我是否需要为此设置
autoflush=False

我已经扫描了,但没有找到答案。
搜索发现了一些相关问题,如和,但我不清楚。

也许这会起作用?

如果您使用的是SQLAlchemy的连接池,那么您看到的可能是使用后连接关闭时发生的自动回滚。显然有必要保证连接在下次从池中拉出时“干净”。有关更多信息,请参阅;搜索顶部附近的“池机制”

据我回忆(我上次使用它已有几年了),将隔离级别更改为自动提交并不能解决问题,因为它不会将SELECT语句视为需要提交


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

您确定sqlalchemy真的是负责回滚的人吗?可能是您使用的框架在请求循环结束时自动回滚未受限制的会话吗?不完全确定,我必须询问我的合作伙伴。我想它正在使用中。但是,在这种情况下,我们不能只
COMMIT
来防止框架回滚吗?明确提交隔离事务或将隔离级别设置为零就足够了。我想问的是,如果您使用的是一个应用程序框架,如Pylons或Zope,它以某种方式为您管理数据库状态;在普通的python脚本中是否只使用sqlalchemy?每个
会话
实例的生命周期是如何管理的?如果您可以发布SA使用情况下合作伙伴的相应代码,那就太好了。我的第一个猜测是甚至没有调用session.commit(),回滚来自连接池管理,以确保新请求的干净连接。