原文: https://www.tizi365.com/archives/22.html

--------------------------------------------------------

一、前言

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

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

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

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

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

二、gorm更新记录常用方法

1. Save

用于保存模型变量的值。

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

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

2. Update

更新单个字段值

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

3. Updates

更新多个字段值

  1. //例子1:
  2. //通过结构体变量设置更新字段
  3. updataFood := Food{
  4. Price:120,
  5. Title:"柠檬雪碧",
  6. }
  7. //根据food模型更新数据库记录
  8. //等价于: UPDATE `foods` SET `price` = '120', `title` = '柠檬雪碧' WHERE `foods`.`id` = '2'
  9. //Updates会忽略掉updataFood结构体变量的零值字段, 所以生成的sql语句只有price和title字段。
  10. db.Model(&food).Updates(&updataFood)
  11. //例子2:
  12. //根据自定义条件更新记录,而不是根据模型id
  13. updataFood := Food{
  14. Stock:120,
  15. Title:"柠檬雪碧",
  16. }
  17. //设置Where条件,Model参数绑定一个空的模型变量
  18. //等价于: UPDATE `foods` SET `stock` = '120', `title` = '柠檬雪碧' WHERE (price > '10')
  19. db.Model(Food{}).Where("price > ?", 10).Updates(&updataFood)
  20. //例子3:
  21. //如果想更新所有字段值,包括零值,就是不想忽略掉空值字段怎么办?
  22. //使用map类型,替代上面的结构体变量
  23. //定义map类型,key为字符串,value为interface{}类型,方便保存任意值
  24. data := make(map[string]interface{})
  25. data["stock"] = 0 //零值字段
  26. data["price"] = 35
  27. //等价于: UPDATE `foods` SET `price` = '35', `stock` = '0' WHERE (id = '2')
  28. 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函数用于设置表达式

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

gorm 更新数据时,0值会被忽略的更多相关文章

  1. FreeSql (十二)更新数据时指定列

    var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...

  2. FreeSql (十三)更新数据时忽略列

    var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...

  3. mongodb 更新数据时int32变为double的解决办法 & 教程

    https://www.runoob.com/mongodb/mongodb-mongodump-mongorestore.html mongodb 更新数据时int32变为double的解决办法   ...

  4. mongoose 更新数据时不验证数据(忽略设定的集合规则)的问题

    问题: mongoose 更新数据时不验证数据(忽略设定的集合规则)的问题 参考: http://www.mongoosejs.net/docs/api.html#updateone_updateOn ...

  5. 在Oracle中更新数据时,抛出:ORA-01008: not all variables bound

    在Oracle中更新数据时,抛出了一个 :ORA-01008 not all variables bound, 我的理解是不是所有的变量/参数都有边界,不懂: 后来知道了,原来是“不是所有变量/参数都 ...

  6. SQL中使用UPDATE更新数据时一定要记得WHERE子句

    我们在使用 SQL 中的 UPDATE 更新数据时,一般都不会更新表中的左右数据,所以我们更新的数据的 SQL 语句中会带有 WHERE 子句,如果没有WHERE子句,就回更新表中所有的数据,在 my ...

  7. ORACLE更新数据时如果有就更新没有就插入

    SQL写法: begin update table_name set salary = 10000 where emp_id = 5; if sql%notfound then insert into ...

  8. MySQL更新数据时,日志(redo log、binlog)执行流程

    1:背景 项目需要做Es和数据库的同步,而手动在代码中进行数据同步又是Es的一些不必要的数据同步操作和业务逻辑耦合,所以使用的了读取mysql的binlog日志的方式进行同步Es的数据. 问题1:根据 ...

  9. 使用xadmin更新数据时,报错expected string or bytes-like object

    expected string or bytes-like object 期望的字符串或类似字节的对象,一般为数据类型不匹配造成 本人在实际项目里发现的问题是: 数据库里的字段类型与django里mo ...

随机推荐

  1. 如何找到linux centos7 中 redis.conf

    我们假设redis正在运行,但是我们找不带redis的配置文件redis.conf. 正确的示范: (1)systemctl status redis ● redis.service - LSB: s ...

  2. Dapper操作Sql Server和MySql数据库

    1. 在配置文件web.config中添加连接字符串 <connectionStrings> <add name="sqlconnectionString" co ...

  3. webstorm2017中添加git

    1.pc中先安装git 2.在webstorm中选择VCS -> Checkout from Version Control -> Git Git Repository URL:  [gi ...

  4. Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?

    什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的. 如果重 ...

  5. 深度图转伪彩色图(python)

    kinect得到的深度图灰不拉几,人眼很难识别出其中的物体,感知深度的变化. 在做展示的时候,我们往往需要可视化,使用OpenCV的预定义的颜色映射来将灰度图像伪彩色化,在OpenCV中使用apply ...

  6. Python 第一式

    @Codewars Python练习 question ** Dashatize it ** Given a number, return a string with dash'-'marks bef ...

  7. C#基础算法题 找出最大值和最小值

    找出最大值和最小值 题目要求 输入n个数,n<=100,找到其中最小的数和最大的数 实现代码 using System; namespace _1.求最大最小 { class Program { ...

  8. vue-cookies的使用

    安装vue-cookies npm install vue-cookies --save 使用vue-cookies // 在main.js中 // require var Vue = require ...

  9. Nuget常用命令(转)

    转自:https://www.cnblogs.com/xcsn/p/6259853.html CMD将nuget升级到最新版本:nuget update -self 一.安装 1.安装指定版本类库in ...

  10. Http 与 Https区别

    传统Http协议弊端 传统Http协议弊端是明文的,如果别人采用抓包分析可以获取到明文数据. 什么是Https协议 HTTPS(Hyper Text Transfer Protocol over Se ...