当前位置: 首页 > news >正文

一七零、GORM值为0或者空字符串的时候不能被更新创建的五种解决办法

在使用grom时,如果用结构体的形式,对数据库进行更新时,会出现一个问题:当我们想要将某个字段的值更新为0&空字符串,执行update之后会发现该数据实际上并没有被更新。
例如有如下数据表:

idnamescoredesc
1王五99调皮

有如下结构体:

type Student struct{Id    int32 `gorm:"type:int(11);column:id;primaryKey;autoIncrement;comment:" json:"id"`Name  string `gorm:"type:varchar(100);column:name;not null;default:'';comment:姓名"`Score int32 `gorm:"type:int(11);column:score;comment:分数"`Desc  string `gorm:"type:varchar(1000);column:desc;default:'';comment:备注"`
}

当我们执行以下操作后

upStudent := Student{Id    :1,Name  :张三,Score :0,Desc:""
}db.Model(&student).Where("id=?", Student.Id).Updates(Student)

会发现,执行成功之后,score依旧等于99,Desc也是"调皮"

解决方法一:结合 Select 和 Omit

fields := []string{"id","name","score",”desc“}
db.Model(&Student).Select(fields).Where("id=?", Student.Id).Updates(Student)
// 或者Omit
db.Model(&Student{}).Omit("id").Where("id = ?", upStudent.Id).Updates(upStudent)

解决方法二:使用Save

注:Save 会保存所有的字段,即使字段是零值;保存是一个组合函数。 如果保存值不包含主键,它将执行 Create,否则它将执行 Update (包含所有字段)。

db.Model(&Student).Where("id=?", Student.Id).Save(Student)

解决方法三:使用map接口,即map[string]interface{} (推荐)

注:我们使用的是protobuf定义了的结构时,转换成map有些许麻烦。

values := map[string]interface{}{"id":          upStudent.Id,"name":      upStudent.Name,"score":   upStudent,Score,"desc":upStudent,Desc,}
db.Model(&Student).Where("id=?", Student.Id).Updates(values)

解决方法三:使用map接口,即map[string]interface{} (推荐)

注:我们使用的是protobuf定义了的结构时,转换成map有些许麻烦。

values := map[string]interface{}{"id":          upStudent.Id,"name":      upStudent.Name,"score":   upStudent,Score,"desc":upStudent,Desc,}
db.Model(&Student).Where("id=?", Student.Id).Updates(values)

解决方法四:逐字段单独赋值

注:我们使用的是protobuf定义了的结构时,转换成map有些许麻烦。

upStudent := Student{Id    : 1,
}db.Model(&Student{}).Where("id = ?", upStudent.Id).Update("score", 0).Update("name", "张三").Update("desc", "")

解决方法五:定义 Struct 时将字段设置为指针类型

通过将字段定义为指针类型,可以避免默认忽略 0 值的问题。同样适用于空字符串。

score := int32(0)
name := "张三"
desc := ""
upStudent := Student{Id    : 1,Name  : &name,Score : &score,Desc: &desc,
}
db.Model(&Student{}).Where("id = ?", upStudent.Id).Updates(upStudent)

http://www.mrgr.cn/news/36726.html

相关文章:

  • 【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题
  • electron使用npm install出现下载失败的问题
  • bat脚本的命名方式导致一个脚本不能使用的不明原因的怪事
  • 18 vue3之自动引入ref插件深入使用v-model
  • OceanBase云数据库战略实施两年,受零售、支付、制造行业青睐
  • Vue3 获取验证码按钮,倒计时60s
  • 「点击即复制!」——超实用 JavaScript 实现技巧
  • OpenHarmony(鸿蒙南向)——平台驱动指南【HDMI】
  • TopOn对话游戏魔客:2024移动游戏广告应如何突破?
  • 【GIS】Leaflet:Web地图快速上手
  • 外包干了1个多月,技术明显退步了。。。。。
  • 我在 Thoughtworks 被裁前后的经历
  • 用户体验分享 | YashanDB V23.2.3安装部署
  • 知识图谱检索 Graph-Based Retriever:文本块到结构化数据的转换,解决语义检索捕获不了的长尾关系
  • 283. 移动0
  • PHP之 实现https ssl证书到期提醒,通过企微发送消息
  • 江协科技STM32学习- P19 TIM编码器接口
  • 22.4k star,好用、强大的链路监控软件,skywalking
  • Appium跨平台测试实战:从Android到iOS
  • ai智能抠图有哪些?我只告诉你这些