> gorm查詢數據本質上就是提供一組函數,幫我們快速拼接sql語句,盡量減少編寫sql語句的工作量
[TOC]
## 測試表
~~~
CREATE TABLE `food` (
`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;
~~~
## 模型定義
~~~
//商品
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 "food"
}
~~~
## gorm更新記錄常用方法
### 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)
~~~
### 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)
~~~
### 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類型替代結構體。
### 更新表達式
> gorm提供了Expr函數用于設置表達式
~~~
//等價于: UPDATE `foods` SET `stock` = stock + 1 WHERE `foods`.`id` = '2'
db.Model(&food).Update("stock", gorm.Expr("stock + 1"))
~~~
- 基礎知識
- 開發環境
- 包名規則
- 包初始化 (init)
- 基礎數據類型
- 基礎類型轉換
- 格式化輸出
- go指針
- 流程控制語句
- 函數定義
- 匿名函數
- 數組和切片
- map集合
- 結構體
- Interface接口
- 日期處理
- 數學計算
- 正則表達式
- 協程 (并發處理)
- channel
- waitgroup
- mutex (鎖機制)
- websocket
- protobuf
- Redis
- 錯誤處理
- 打包程序
- NSQ消息隊列
- 單元測試
- beego
- 安裝入門
- Gin
- 快速入門
- 路由與控制器
- 處理請求參數
- 表單驗證
- 處理響應結果
- 渲染HTML模版
- 訪問靜態文件
- Gin中間件
- Cookie處理
- Session處理
- Gin上傳文件
- swagger
- pprof性能測試
- GORM
- 入門教程
- 模型定義
- 數據庫連接
- 插入數據
- 查詢數據
- 更新數據
- 刪除數據
- 事務處理
- 關聯查詢
- 屬于 (BELONG TO)
- 一對一 (Has One)
- 一對多 (Has Many)
- 多對多 (Many to Many)
- 預加載 (Preloading)
- 錯誤處理
- 第三方常用插件
- viper 讀取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷鍵