报错内容
在用 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 聊聊, 查看更多联系方式