Golang Gorm Error 1292: Incorrect datetime value: '0000-00-00' for column

文章目录

    报错内容

    在用 Golang Gorm 更新 MySQL 一条数据时,报错:

    Error 1292: Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1
    UPDATE `repair` SET `created_at`='0000-00-00 00:00:00',`updated_at`='2021-06-03 17:03:31.359' WHERE `id` = 2
    

    报错代码

    我是将 Antd Pro Web 管理后台的数据通过 API 接口发送给后台 Golang 接口,进行更新。

    由于前端不需要更新数据的创建时间,所以 Form 提交时,就没有提交 created_at 字段。
    从而导致从请求解析数据到 struct 结构时,将 created_at 解析成了 0000 这种格式。

    models.DB.Save(&repair)
    

    Gorm Save 会保存所有的字段,即使字段是零值。

    解决方法 Select 指定字段

    合理的做法是,用 Select。设置需要更新的字段。

    models.DB.Select("status", "notes", "updated_at").Updates(repair)
    

    使用 Select 的好处:

    • 这样不但能排除 created_at 这种不需要更新的字段,同时也很好的限制了不应该由用户更新的内容。
    • Select 可以更新零值字段。例如,notes 备注这种字段,可以更新为空字符串。

    (不推荐) Omit 并不合理

    如果用 Omit 排除 created_at 字段:

    models.DB.Omit("created_at").Updates(repair)
    

    用 Omit 会有一个问题,就是零值不更新。

    例如,我一个字段想从有内容,变成没有内容,那么这个更新操作就会失败。

    其他可以更新 0 值的方法

    • save
    • updates map 类型,而不是 struct

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式