我正在使用 Pony ORM 0.7 版和磁盘上的 Sqlite3 数据库,并遇到了这个问题:我正在执行选择,然后是更新,然后是选择,然后是另一个更新,并收到错误消息
pony.orm.core.UnrepeatableReadError: Value of Task.order_id for
Task[23654] was updated outside of current transaction (was: 1, now: 2)
我已将问题减少到导致问题的最小命令集(即删除任何内容会导致问题不发生):
@db_session
def test_method():
tasks = list(map(Task.to_dict, Task.select()))
db.execute("UPDATE Task SET order_id=order_id*2")
task_to_move = select(task for task in Task if task.order_id == 2).first()
task_to_move.order_id = 1
test_method()
为了完整起见,这里是 的定义Task
:
class Task(db.Entity):
text = Required(unicode)
heading = Required(int)
create_timestamp = Required(datetime)
done_timestamp = Optional(datetime)
order_id = Required(int)
另外,如果我从我的选择中删除约束task.order_id == 2
,则问题不再发生,所以我认为问题与基于事务开始后已更改的字段的查询有关,但我不知道为什么错误消息告诉我它已被不同的事务更改(除非可能db.execute
是在单独的事务中执行,因为它是原始 SQL?)
我已经看过这个类似的问题,但问题不同(Pony ORM 报告记录“在当前事务之外更新”而没有其他事务)和本文档(https://docs.ponyorm.com/ transactions.html ) 但都没有解决我的问题。
有什么想法可能会在这里发生吗?