sqlalchemy回滚的原因

时间:2014-03-03 17:13:13

标签: python postgresql sqlalchemy

我使用sqlalchemy将数据存储到postgresql数据库中。我有点困惑,sqlalchemy回滚执行而不抛出异常。我找到article in the documentary并试图通过设置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()

有没有人有想法,这可能是回滚的原因?

2 个答案:

答案 0 :(得分:1)

不是100%确定原因,但查看source,我们可以看到,当您在trans.commit()构造中执行with....时,它会将事务设置为无效。现在当事务的Context Manager尝试在__exit__()语句末尾运行with方法时,它会触发rollback(),因为is_active标志已经被设为假。 (我不知道当您提交事务然后将其回滚时会发生什么。)

无论如何,“问题”是with构造隐式地处理提交和回滚部分。根据{{​​3}},您需要做的只是

with conn.begin() as trans:      
    statement = meta.tables[_table_name].insert().values(
    ...
    )
    res = conn.execute(statement)

答案 1 :(得分:0)

好的,我没有关于这种习惯的原因,但在声明的末尾加上conn.execute("commit")解决了这个问题。