SQLAlchemy特定更新查询如何跳过已定义的onupdate默认回调
跳过
onupdate逻辑的解决方案 根据你的onupdate逻辑定义的层级,有两种对应的处理方案:
1. ORM层定义的onupdate回调(以SQLAlchemy为常见场景)
大部分情况下onupdate是在ORM模型字段上绑定的回调逻辑,仅在修改模型实例并提交时触发,可通过两种方式跳过:
- 单条数据更新时,显式给
updated字段赋值为原有值
手动赋值的优先级高于onupdate自动回调,会直接覆盖自动更新逻辑,示例代码:# 先查询目标帖子实例 target_post = db.session.query(Post).get(post_id) # 执行标记违规的业务修改 target_post.inappropriate_report = True # 显式将updated字段赋值为原有值 target_post.updated = target_post.updated # 提交修改 db.session.commit() - 批量更新时,直接使用Query的
update()方法
直接调用查询对象的update方法生成SQL执行更新,不会触发ORM层的实例onupdate回调,示例代码:db.session.query(Post).filter(Post.id.in_(need_mark_ids)).update( {"inappropriate_report": True}, synchronize_session=False ) db.session.commit()
2. 数据库表结构定义的ON UPDATE自动更新
如果你的updated字段自动更新是直接在数据库层面定义的(比如MySQL的TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP),只需要在执行UPDATE语句时显式指定updated等于原有值即可:
UPDATE posts SET inappropriate_report = 1, updated = updated WHERE id = 101;
语句中updated = updated会让数据库保留该字段的原有值,跳过ON UPDATE的自动赋值逻辑。
内容的提问来源于stack exchange,提问作者zion
相关产品推荐
相关产品推荐

