美文网首页
gorm使用结构体更新时0,空,nil被忽略的情况

gorm使用结构体更新时0,空,nil被忽略的情况

作者: 哆啦在这A梦在哪 | 来源:发表于2020-02-25 13:27 被阅读0次

更新单个字段值

//例子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)
  1. 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类型替代结构体。

注意:使用map不需要使用&这个符号

注意:使用map不需要使用&这个符号

注意:使用map不需要使用&这个符号

相关文章

网友评论

      本文标题:gorm使用结构体更新时0,空,nil被忽略的情况

      本文链接:https://www.haomeiwen.com/subject/xlazqhtx.html