Golang Go语言中gorm不更新0值的问题,大家有好的方式吗
已知的方式:
1 、字段使用指针
2 、Updates 参数使用 map
3 、使用 select 函数,然后 Updates
感觉都不太智能.
Golang Go语言中gorm不更新0值的问题,大家有好的方式吗
写一个专门更新的 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 方法不行么,存所有的字段,即使字段是零值
map
save 也是一种解决方案,但是如果 model 里有 id ,created_at 这类字段的话,也会被更新到数据库,还需要特殊处理,比如用 omit 函数
学到了,转换过程中去除了 autoCreateTime 、autoUpdateTime 字段
在Golang中使用GORM时,默认情况下,当字段的值为该字段类型的零值时(如int的0,string的""等),GORM在更新记录时会忽略这些字段,因为它们被视为未更改。这种行为在某些情况下可能会导致数据不一致。
有几种方法可以解决GORM不更新零值的问题:
-
使用
Select
和Omit
方法: 在更新时,可以显式地指定要更新的字段,即使这些字段的值为零值。例如,db.Model(&user).Select("Name", "Age").Updates(User{Name: "", Age: 0})
。 -
使用
map
更新: 通过传递一个map[string]interface{}
来更新字段,GORM会更新所有指定的字段,不论其值是否为零值。例如,db.Model(&user).Updates(map[string]interface{}{"Name": "", "Age": 0})
。 -
使用
gorm:"default"
标签: 在结构体定义中,可以为字段设置gorm:"default:<value>"
标签,这样即使字段值为零值,GORM也会将其视为已更改并尝试更新。但这种方法通常用于设置默认值,而不是解决零值更新问题。 -
自定义SQL: 如果上述方法都不适用,可以编写自定义SQL语句来执行更新操作。
选择哪种方法取决于具体的应用场景和需求。在大多数情况下,使用map
更新或显式指定字段是一种简单而有效的解决方案。