Gorm更新零值问题解决思路与过程

作者:Ch3n 时间:2024-04-25 13:18:25 

一、前言

为方便描述教程例子,这里给出mysql表结构定义和golang结构体定义。

下面是教程用到的foods表结构定义:

CREATE TABLE `foods` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品id',
 `title` varchar(100) NOT NULL COMMENT '商品名',
 `price` float DEFAULT '0' COMMENT '商品价格',
 `stock` int(11) DEFAULT '0' COMMENT '商品库存',
 `type` int(11) DEFAULT '0' COMMENT '商品类型',
 `create_time` datetime NOT NULL COMMENT '商品创建时间',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

下面是foods表对应的golang结构体类型

//商品
type Food struct {
Id         int
Title      string
Price      float32
Stock      int
Type       int
//mysql datetime, date类型字段,可以和golang time.Time类型绑定, 详细说明请参考:gorm连接数据库章节。
CreateTime time.Time
}
//为Food绑定表名
func (v Food) TableName() string {
return "foods"
}

二、gorm更新记录常用方法

1. Save

用于保存模型变量的值。

提示: 相当于根据主键id,更新所有模型字段值。

food := Food{}
//先查询一条记录, 保存在模型变量food
//等价于: SELECT * FROM `foods`  WHERE (id = '2') LIMIT 1
db.Where("id = ?", 2).Take(&food)
//修改food模型的值
food.Price = 100
//等价于: UPDATE `foods` SET `title` = '可乐', `type` = '0', `price` = '100', `stock` = '26', `create_time` = '2018-11-06 11:12:04'  WHERE `foods`.`id` = '2'
db.Save(&food)

2. Update

更新单个字段值

//例子1:
//更新food模型对应的表记录
//等价于: UPDATE `foods` SET `price` = '25'  WHERE `foods`.`id` = '2'
db.Model(&food).Update("price", 25)
//通过food模型的主键id的值作为where条件,更新price字段值。
//例子2:
//上面的例子只是更新一条记录,如果我们要更全部记录怎么办?
//等价于: UPDATE `foods` SET `price` = '25'
db.Model(Food{}).Update("price", 25)
//注意这里的Model参数,使用的是Food{},新生成一个空白的模型变量,没有绑定任何记录。
//因为Food{}的id为空,gorm库就不会以id作为条件,where语句就是空的
//例子3:
//根据自定义条件更新记录,而不是根据主键id
//等价于: UPDATE `foods` SET `price` = '25'  WHERE (create_time > '2018-11-06 20:00:00')
db.Model(Food{}).Where("create_time > ?", "2018-11-06 20:00:00").Update("price", 25)

3. Updates

更新多个字段值

//例子1:
//通过结构体变量设置更新字段
updataFood := Food{
Price:120,
Title:"柠檬雪碧",
}
//根据food模型更新数据库记录
//等价于: UPDATE `foods` SET `price` = '120', `title` = '柠檬雪碧'  WHERE `foods`.`id` = '2'
//Updates会忽略掉updataFood结构体变量的零值字段, 所以生成的sql语句只有price和title字段。
db.Model(&food).Updates(&updataFood)
//例子2:
//根据自定义条件更新记录,而不是根据模型id
updataFood := Food{
Stock:120,
Title:"柠檬雪碧",
}
//设置Where条件,Model参数绑定一个空的模型变量
//等价于: UPDATE `foods` SET `stock` = '120', `title` = '柠檬雪碧'  WHERE (price > '10')
db.Model(Food{}).Where("price > ?", 10).Updates(&updataFood)
//例子3:
//如果想更新所有字段值,包括零值,就是不想忽略掉空值字段怎么办?
//使用map类型,替代上面的结构体变量
//定义map类型,key为字符串,value为interface{}类型,方便保存任意值
data := make(map[string]interface{})
data["stock"] = 0 //零值字段
data["price"] = 35
//等价于: UPDATE `foods` SET `price` = '35', `stock` = '0'  WHERE (id = '2')
db.Model(Food{}).Where("id = ?", 2).Updates(data)

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

4. 更新表达式

UPDATE foods SET stock = stock + 1 WHERE id = '2'

这样的带计算表达式的更新语句gorm怎么写?

gorm提供了Expr函数用于设置表达式

//等价于: UPDATE `foods` SET `stock` = stock + 1  WHERE `foods`.`id` = '2'
db.Model(&food).Update("stock", gorm.Expr("stock + 1"))

三、使用struct更新仅适用于非零值

user:=User{
Name:"",
Age:0,
Actived:false,
}
db.Model(&user).Updates(user)
//此时不会更新这些零值,如需更新零值使用map
userMap:=map[string]interface{}{
 "name":"",
 "age":0,
 "actived":0,
}
db.Model(&user).Updates(userMap)

来源:https://ch3nnn.blog.csdn.net/article/details/126019371

标签:GoLang,Gorm,更新零值
0
投稿

猜你喜欢

  • 你还在 Select * 吗?

    2024-01-24 22:10:50
  • 关于MySql 10038错误的完美解决方法(三种)

    2024-01-27 06:16:18
  • 解决90%的常见问题的8个python NumPy函数

    2021-12-06 23:33:39
  • ASP访问数量统计代码

    2011-04-08 10:59:00
  • python实现图像全景拼接

    2023-05-08 13:29:24
  • Oracle8i和Microsoft SQL Server比较

    2010-07-26 13:05:00
  • PyQt5主窗口动态加载Widget实例代码

    2023-06-04 21:20:32
  • W3C发布HTML 5草案 最终版将于2010年敲定

    2008-01-26 19:16:00
  • 刷新页面的几种方法小结(JS,ASP.NET)

    2024-05-28 15:37:33
  • JS继承--原型链继承和类式继承

    2024-04-23 09:14:45
  • 在ASP.NET 2.0中操作数据之十四:使用FormView 的模板

    2024-03-23 16:07:32
  • Python扩展内置类型详解

    2023-03-19 17:23:36
  • win10上如何安装mysql5.7.16(解压缩版)

    2024-01-23 23:22:53
  • Pyhon Flask框架:第一个Flask程序

    2023-01-09 16:06:34
  • Java实现上传Excel文件并导入数据库

    2024-01-22 02:47:44
  • Python读取文件内容的三种常用方式及效率比较

    2023-08-29 23:46:00
  • python使用7z解压软件备份文件脚本分享

    2023-05-22 19:30:29
  • mybatis连接MySQL8出现的问题解决方法

    2024-01-22 08:27:59
  • pycharm实现猜数游戏

    2023-01-14 19:04:49
  • 详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别

    2023-06-07 14:24:23
  • asp之家 网络编程 m.aspxhome.com