golang gorm 零值更新不生效问题处理

9 篇文章 0 订阅
4 篇文章 0 订阅

快速指南: 通过结构体变量更新字段值, gorm 库会忽略零值字段。就是字段值等于 0, nil, “”, false 这些值会被忽略掉,不会更新。如果想更新零值,可以使用 map 类型替代结构体。

一、问题

我们都知道,使用 golang 定义一个变量并且不赋初始值时,初始值就默认为 0 值,比如 0, nil, “”, false 等。

在使用 gorm 包进行数据库操作时,如果想要进行字段的更新,只需要将要变动的字段进行修改,然后执行 db.Updates() 操作即可。

假定有如下结构体定义:

type User struct {
    ID    int         `gorm:"primary_key;column:id"`
    Name  string `gorm:"column:name"`
    Score int `gorm:"column:score"`
}

现需要将 score 字段由 100 改为 0 时,我们正常的想法是把对应的字段改为 0 值,然后执行 db.Updates() 就好。例如:

func SetUserScoreZero(user *User,id int) error {
    ...
    user.Score = 0
	if err := db.Table("xxx").Where("id = ?", id).Updates(user).Error; err != nil {
		return err
	}
	return nil
}

但是会发现更新不生效,因为将 user.Score 设置为 0 值后;就像不重新赋值 Name ,Name 为 “” 一样,gorm 就不会对其进行修改。

二、解决

如果想更新零值,可以使用 map 类型替代结构体。

代码实现如下:

import (
    ...
    "github.com/fatih/structs"
    ...
)

...

type User struct {
    // 注意,需要添加 structs 的标签,不然 SQL 语句有问题
    ID    int `gorm:"primary_key;column:id" structs:"id"`
    Name  string `gorm:"column:name" structs:"name"`
    Score int `gorm:"column:score" structs:"score"`
}

...

func SetUserScoreZero(user *User,id int) error {
    ...
    user.Score = 0
    // 使用 structs 库将 struct 转换为 Map
    userMap := structs.Map(user)
	if err := db.Table("xxx").Where("id = ?", id).Updates(userMap).Error; err != nil {
		return err
	}
	return nil
}
...

参考:
gorm update 使用: https://blog.51cto.com/u_15061931/4595514

结构体转map[string]interface{}的若干方法
https://www.liwenzhou.com/posts/Go/struct2map/

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值