python - sqlalchemy 回滚的原因

标签 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()

有谁知道回滚的原因是什么?

最佳答案

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

无论如何,“问题”是 with 构造隐式处理提交和回滚部分。根据 docs , 你需要做的就是

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

关于python - sqlalchemy 回滚的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22152943/

相关文章:

python - SQLAlchemy 急切加载多个关系

python - pandas 列值到行值

Python - 乘以二维列表中的元素

python - 在python中发送串行消息

java - 组织.postgresql.util.PSQLException : The connection attempt failed

python - sqlalchemy:无法使用日期列保存模型

python - 使用 for 和 if 语句比较数组元素

sql - postgresql 语法 while exists 循环

sql - 如何从前 50 名中随机选择 8 首具有唯一 user_id 的歌曲?

sqlalchemy - 使用 SQLAlchemy 连接到 Vertica 数据库