我使用sqlalchemy将数据存储到postgresql数据库中。我有点困惑,sqlalchemy没有抛出异常,而是在执行时回滚。我找到了一个纪录片中的文章,并试图通过设置pool_reset_on_return='commit'来防止回滚
这实际上导致sqlalchemy无动于衷。因此,我插入了一个显式调用trans.commit()的行,该行将导致以下输出:
2014-03-03 18:03:33,390,p:32764 Thread-3, sqlalchemy.engine.base.Engine(_execute_context) [INFO]: INSERT INTO _fd (**)
2014-03-03 18:03:33,391,p:32764 Thread-3, sqlalchemy.engine.base.Engine(_execute_context) [INFO]: {****}
2014-03-03 18:03:33,392,p:32764 Thread-3, sqlalchemy.engine.base.Engine(__init__) [DEBUG]: Col ('fid',)
2014-03-03 18:03:33,393,p:32764 Thread-3, sqlalchemy.engine.base.Engine(process_rows) [DEBUG]: Row (*,)
2014-03-03 18:03:33,393,p:32764 Thread-3, sqlalchemy.engine.base.Engine(_rollback_impl) [INFO]: ROLLBACK到目前为止,代码退出很简单:
1837 with conn.begin() as trans:
1838 statement = meta.tables[_table_name].insert().values(
...
1847 )
1848 res = conn.execute(statement)
1849 trans.commit()有没有人知道,回滚的原因是什么?
发布于 2014-03-05 07:58:26
好的,我没有胶水来解释这个习惯的原因,但是在语句的末尾加上一个conn.execute("commit")可以解决这个问题。
发布于 2014-03-07 18:27:10
不能100%确定原因,但是看看来源,我们可以看到,当您在with....构造中执行trans.commit()时,它将事务设置为非活动。现在,当事务的Context Manager试图在with语句末尾运行__exit__()方法时,它会触发rollback(),因为is_active标志已设置为False。(我不知道当您提交事务然后回滚时会发生什么)。
无论如何,“问题”是with构造隐式地处理提交和回滚部分。根据文档,你所需要做的就是
with conn.begin() as trans:
statement = meta.tables[_table_name].insert().values(
...
)
res = conn.execute(statement)https://stackoverflow.com/questions/22152943
复制相似问题