Golang Go语言中gorm不更新0值的问题,大家有好的方式吗

已知的方式:
1 、字段使用指针
2 、Updates 参数使用 map
3 、使用 select 函数,然后 Updates
感觉都不太智能.


Golang Go语言中gorm不更新0值的问题,大家有好的方式吗
10 回复

写一个专门更新的 struct ,字段用指针

更多关于Golang Go语言中gorm不更新0值的问题,大家有好的方式吗的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


UpdateColumns 好像是可以更新 0 值的,但它好像不触发 hook,没用 hook 的话就用它

写个反射函数,把 struct 转成 map 。

可以参考下我处理接口参数零值的方式,还算优雅,从请求到入库
https://github.com/EchoGroot/kratos-examples

Save 方法不行么,存所有的字段,即使字段是零值

save 也是一种解决方案,但是如果 model 里有 id ,created_at 这类字段的话,也会被更新到数据库,还需要特殊处理,比如用 omit 函数

学到了,转换过程中去除了 autoCreateTime 、autoUpdateTime 字段

在Golang中使用GORM时,默认情况下,当字段的值为该字段类型的零值时(如int的0,string的""等),GORM在更新记录时会忽略这些字段,因为它们被视为未更改。这种行为在某些情况下可能会导致数据不一致。

有几种方法可以解决GORM不更新零值的问题:

  1. 使用SelectOmit方法: 在更新时,可以显式地指定要更新的字段,即使这些字段的值为零值。例如,db.Model(&user).Select("Name", "Age").Updates(User{Name: "", Age: 0})

  2. 使用map更新: 通过传递一个map[string]interface{}来更新字段,GORM会更新所有指定的字段,不论其值是否为零值。例如,db.Model(&user).Updates(map[string]interface{}{"Name": "", "Age": 0})

  3. 使用gorm:"default"标签: 在结构体定义中,可以为字段设置gorm:"default:<value>"标签,这样即使字段值为零值,GORM也会将其视为已更改并尝试更新。但这种方法通常用于设置默认值,而不是解决零值更新问题。

  4. 自定义SQL: 如果上述方法都不适用,可以编写自定义SQL语句来执行更新操作。

选择哪种方法取决于具体的应用场景和需求。在大多数情况下,使用map更新或显式指定字段是一种简单而有效的解决方案。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!