gorm结构体零值不更新问题及解决方案
更新时间:2025年12月31日 10:17:26 作者:水水wwater
在使用GORM进行更新操作时,如果结构体中的零值或空值不被更新,可以通过结合结构体和map来解决,具体方法是:在更新时,将需要更新的字段放入map中,并判断字段值是否为零值或空值,如果是,则将该字段值设置为空字符串或0,此外,更新单行数据时,必须在map中包含主键赋值
问题描述
在使用gorm的时候如果用结构体进行update或者updates会出现零值、空值不更新的问题,常见的办法有两种:
1.使用Save(),但是Save会保存所有字段,也就是说,必须将所有字段信息全部获取才能更新,否则没有传值的字段会更新成空。
2.使用map接口,即map[string]interface{},但是当我们使用的是protobuf定义了的结构时,转换成map有些许麻烦。
那么该如何解决呢?
解决办法
合理结合结构体和map来达到可以更新0值的结果。由于在传入字段的时候如果为0值或者空值会被gorm自动忽略,所以在传入的时候注意需要传入一个可判断的字段,
例如我在这里让前端传的是“无”这个字符串,判断是否为“无”字符串,如果是,那么新建一个map[string]interface{}包含number并赋值为空(或者0)。
然后正常将其他字段更新一遍,再通过map将零/空值字段进行更新保存。
var null sql.NullString
if object.Number == "无" {
values := map[string]interface{}{
"id": objectTmp.Id,
"number": null.String,
}
repo.db.Model(&object).Update(objectTmp)//正常更新一遍
repo.db.Model(&object).Update(values)//将为0值的字段更新一遍
}
注意:
1. gorm不能传nil到数据库,只能传空字符串,所以在数据库里保存的是空字符串。
2. 更新单行数据一定要在map里面加上主键赋值,否则会批量更新,在我这里是id。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
我为什么喜欢Go语言(简洁的Go语言)
从2000年至今,也写了11年代码了,期间用过VB、Delphi、C#、C++、Ruby、Python,一直在寻找一门符合自己心意和理念的语言。我很在意写代码时的手感和执行的效率,所以在Go出现之前一直没有找到
2014-10-10
基于Golang实现YOLO目标检测算法
目标检测是计算机视觉领域的重要任务,它不仅可以识别图像中的物体,还可以标记出物体的位置和边界框,YOLO是一种先进的目标检测算法,以其高精度和实时性而闻名,本文将介绍如何使用Golang实现YOLO目标检测算法,文中有相关的代码示例供大家参考,需要的朋友可以参考下
2023-11-11
Go Struct结构体的具体实现
Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性,本文主要介绍了Go Struct结构体的具体实现,感兴趣的可以了解一下
2023-03-03
如何避免Go语言常见错误之意外的变量隐藏
在Go语言中,变量隐藏(Variable Shadowing)是一个常见的错误来源,变量隐藏发生在一个内部作用域中声明的变量与外部作用域的变量同名时,这可能导致开发者无意中使用了错误的变量,造成难以追踪的bug,本文讲解一些关于变量隐藏的常见错误和如何避免它们的方法
2024-01-01
Go使用proto3的踩坑实战记录
这篇文章主要给大家介绍了关于Go使用proto3的踩坑记录,文中通过实例代码介绍的非常详细,对大家学习或者会用Go语言具有一定的参考学习价值,需要的朋友可以参考下
2023-02-02
Go中使用单调时钟获得准确的时间间隔问题
这篇文章主要介绍了Go中使用单调时钟获得准确的时间间隔,在go语言中,没有直接调用时钟的函数,可以通过 time.Now() 获得带单调时钟的 Time 结构体,并通过Since和Until获得相对准确的时间间隔,需要的朋友可以参考下
2022-06-06
Go 跨域中间件解决CORS问题
跨域问题CORS是前端开发人员经常遇到的问题,本文主要介绍了Go 跨域中间件解决CORS问题,具有一定的参考价值,感兴趣的可以了解一下
2025-04-04
Go get命令使用socket代理的方法
由于某些不可描述的原因,国内使用 go get 命令安装某些包的时候会超时导致失败,比如 net 包、 sys 包、 tools 包等。这篇文章给大家介绍go get 命令使用socket 代理的方法,感兴趣的朋友一起看看吧
2018-10-10
最新评论