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。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Golang中的结构体和反射示例详解

    Golang中的结构体和反射示例详解

    文章介绍了Go语言中结构体的使用、结构体与JSON数据的转换以及反射机制,反射允许在运行时获取类型信息、动态调用方法、访问属性和构造对象,文章还提到了使用reflect包来获取和操作结构体的字段、方法、类型和值,本文结合实例代码介绍的非常详细,感兴趣的朋友一起看看吧
    2025-10-10
  • Go语言中map使用和并发安全详解

    Go语言中map使用和并发安全详解

    golang 自带的map不是并发安全的,并发读写会报错,所以下面这篇文章主要给大家介绍了关于Go语言中map使用和并发安全的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Golang使用ReverseProxy实现反向代理的方法

    Golang使用ReverseProxy实现反向代理的方法

    本文介绍了如何使用Golang的ReverseProxy实现反向代理,包括源码结构解析和官方单机示例NewSingleHostReverseProxy,同时指出,若要实现负载均衡,需要自行开发,还提供了一个简单的HTTP服务用于测试,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Go开发go-optioner工具实现轻松生成函数选项模式代码

    Go开发go-optioner工具实现轻松生成函数选项模式代码

    go-optioner 是一个在 Go 代码中生成函数选项模式代码的工具,可以根据给定的结构定义自动生成相应的选项代码,下面就来聊聊go-optioner是如何使用的吧
    2023-07-07
  • go语言题解LeetCode506相对名次示例详解

    go语言题解LeetCode506相对名次示例详解

    这篇文章主要为大家介绍了go语言题解LeetCode506相对名次示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go语言拼接URL路径的三种方法

    Go语言拼接URL路径的三种方法

    本文主要介绍了Go语言拼接URL路径的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • go中使用curl实现https请求的示例代码

    go中使用curl实现https请求的示例代码

    本文主要介绍了go中使用curl实现https请求的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-06-06
  • golang time包做时间转换操作

    golang time包做时间转换操作

    这篇文章主要介绍了golang time包做时间转换操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • GOLang判断进程是否存在实现方式

    GOLang判断进程是否存在实现方式

    该文主要介绍了使用Go语言编写进程检测工具的方法,由于Go语言本身没有直接获取进程信息的功能,作者决定通过执行命令的方式实现,最终给出了优化后的代码示例
    2026-04-04
  • Go语言开发实现一个图片批量压缩工具

    Go语言开发实现一个图片批量压缩工具

    在日常开发和办公中,图片体积过大会带来不少困扰,本文将使用Go语言编写一个图片批量压缩工具,文中的示例代码讲解详细,需要的可以了解下
    2025-09-09

最新评论