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

更新日期: 2023-06-21 阅读次数: 8704 字数: 356 分类: golang

报错内容

在用 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

tags: gorm

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式