You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy会话监听器中orm_execute_state.is_update始终返回False问题

问题描述

用户配置了如下Session会话监听器:

@event.listens_for(Session, "do_orm_execute")
def do_orm_execute(orm_execute_state):
    print('is_update', orm_execute_state.is_update)

即便修改ORM对象并提交,is_update始终返回False。例如更新User实例名称的场景:

user = session.get(User,'some_id')
user.name = "New and updated name"
session.commit()
session.execute()

新名称已成功写入数据库,do_orm_execute监听器被触发,且orm_execute_state.is_select返回True,但orm_execute_state.is_update始终为False。

原因解析
  • flush自动更新不触发do_orm_execute事件:调用session.commit()时,SQLAlchemy会自动执行flush操作,将内存中修改的User对象同步到数据库,这个过程会生成并执行UPDATE语句,但flush属于框架内部的自动同步逻辑,不会触发do_orm_execute事件。
  • 监听器触发来自无参数的session.execute():代码最后调用的session.execute()未传入任何SQL或ORM操作指令,这会触发一个默认的查询类执行,因此orm_execute_state.is_select返回True,而这次操作本身并非更新,所以is_update为False。
  • is_update仅针对显式ORM更新操作:do_orm_execute的is_update属性,仅当执行显式的UPDATE操作(比如session.execute(update(User).where(User.id == 'some_id').values(name="New Name")))时才会返回True,对象修改后自动flush的更新不在该属性的判定范围内。

内容的提问来源于stack exchange,提问作者Michael Seltenreich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:10:20