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
相关产品推荐
相关产品推荐

