網站首頁 編程語言 正文
一、前言
為方便描述教程例子,這里給出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
相關推薦
- 2022-10-06 QT獲取顯示當前時間和日期的方法(用QTime,QDate和QDateTime)_C 語言
- 2022-05-26 Flutter?UI實現側拉抽屜菜單_Android
- 2023-01-11 Rust結構體的定義與實例化詳細講解_Rust語言
- 2022-11-17 Android開發Flutter?桌面應用窗口化實戰示例_Android
- 2022-02-21 C語言switch語句和if用法介紹_C 語言
- 2022-08-03 C++類與對象深入之構造函數與析構函數詳解_C 語言
- 2023-05-23 golang中的單引號轉義問題_Golang
- 2022-07-11 UVM中UVM_ERROR到達一定數量后結束
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支