gorm结构体零值不更新问题及解决方案

Written by

in

文章目录
  • 在使用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。
  • 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: gorm 结构体中 binding 和 msg 结构体标签示例详解 Golang实现自定义时间结构体并支持Json&Gorm golang gorm模型结构体的定义示例 golang gorm 结构体的表字段缺省值设置方式
  • 目录
    • 问题描述
    • 解决办法
    • 总结

    在使用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。

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

    您可能感兴趣的文章:

    • gorm 结构体中 binding 和 msg 结构体标签示例详解
    • Golang实现自定义时间结构体并支持Json&Gorm
    • golang gorm模型结构体的定义示例
    • golang gorm 结构体的表字段缺省值设置方式

    站内搜索