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。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值