sqlalchemy" after_update"之后的级联更新事件

时间:2014-11-19 19:37:47

标签: python sqlalchemy flask-sqlalchemy

我正在尝试在模型更新后级联更新:

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

有没有更好的方法来实现这一目标?我应该直接使用连接对象吗?

2 个答案:

答案 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()