Python sqlalchemy之后的级联更新”;“U更新”之后;事件

Python sqlalchemy之后的级联更新”;“U更新”之后;事件,python,sqlalchemy,flask-sqlalchemy,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.

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

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

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

适用于以后发现此对象的用户。我能够直接成功地使用连接:

@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)
            )

如果有更优雅的方式,我完全赞成。

对于那些后来发现这一点的人。我能够直接成功地使用连接:

@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)
            )

如果有更优雅的方式,我完全赞成。

对于那些后来发现这一点的人。我能够直接成功地使用连接:

@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)
            )

如果有更优雅的方式,我完全赞成。

对于那些后来发现这一点的人。我能够直接成功地使用连接:

@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)
            )

如果有更优雅的方式,我完全赞成。

在更新后调用
时,会话处于刷新状态。因此,您将无法在该会话中提交任何更改。另一种方法是在更新后在
事件处理程序中创建新会话

@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()

更新后调用
时,会话处于刷新状态。因此,您将无法在该会话中提交任何更改。另一种方法是在更新后在
事件处理程序中创建新会话

@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()

更新后调用
时,会话处于刷新状态。因此,您将无法在该会话中提交任何更改。另一种方法是在更新后在
事件处理程序中创建新会话

@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()

更新后调用
时,会话处于刷新状态。因此,您将无法在该会话中提交任何更改。另一种方法是在更新后在
事件处理程序中创建新会话

@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()