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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:27:03