【发布时间】:2018-09-25 06:38:26
【问题描述】:
我正在尝试使用金字塔的事务管理器来提交更改。不幸的是,无论我做什么,它们都会被回滚。
我尝试了简单的:
def handle(conn):
conn.execute('''ALTER TABLE ....''')
with bootstrap(sys.argv[1]) as env:
with env['request'].tm:
handle(env['request'].dbsession)
以及下拉到连接并创建显式事务:
def handle(conn):
with conn.begin() as tran:
conn.execute('''ALTER TABLE ....''')
tran.commit()
with bootstrap(sys.argv[1]) as env:
with env['request'].tm:
handle(env['request'].dbsession.connection())
还有其他几种方式,但每次我都会得到ROLLBACK 而不是COMMIT。
在第一种情况结束时进行简单的提交会导致:
Error: Transaction must be committed using the transaction manager
我对 sqlalchemy 在这种情况下实际上在做什么感到很迷茫——为什么我会通过回滚获得“成功”?我应该怎么做才能承诺?如果在 handle 中存在嵌套的显式事务,它会是什么样子?
【问题讨论】:
-
在其他人给出答案之前,建议查看SQLAlchemy + URL dispatch wiki tutorial中的示例。
-
与其说是 SQLA 在做什么,不如说是 SQLA 和 Zope 事务管理器的组合在做什么。一个可能的原因是您的文本语句未被识别为数据更改操作,因此事务管理器认为只需回滚即可。将您的会话明确标记为已更改并返回报告:blog.bodu.io/2016/04/24/…。
标签: python sqlalchemy pyramid