我正在尝试在模型更新后级联更新:
event.listens_for(Task, "after_update")
def propagate_status(mapper, connection, target):
object = target.object
if object.is_finished():
object.status = COMPLETED
问题是我似乎无法将对象状态提交给实际的数据库。我可以告诉我状态确实已经设置,因为我有一个附加到object.status的监听器。
我试过在对象上调用commit()但结果是:
ResourceClosedError: This transaction is closed
有没有更好的方法来实现这一目标?我应该直接使用连接对象吗?
答案 0 :(得分:2)
对于那些稍后发现的人。我能够直接成功使用连接:
@event.listens_for(Task, "after_update")
def propagate_status(mapper, connection, target):
obj_table = Object.__table__
object = target.object
if object.is_finished():
connection.execute(
scan_table.update().
where(object_table.c.id == object.id).
values(status=COMPLETED)
)
如果有一种更优雅的方式,我就是全力以赴。
答案 1 :(得分:0)
调用after_update
时,会话处于刷新状态。因此,您将无法对该会话进行任何更改。另一种方法是在after_update
事件处理程序
@event.listens_for(Task, "after_update")
def propagate_status(mapper, connection, target):
obj_table = Object.__table__
object = target.object
if object.is_finished():
session = db.create_scoped_session() # or any other way
session.query(Object).filter(Object.id == target.id).update({"status": COMPLETED})
session.commit()