Gorm更新零值問題解決思路與過程
一、前言
為方便描述教程例子,這里給出mysql表結(jié)構(gòu)定義和golang結(jié)構(gòu)體定義。
下面是教程用到的foods表結(jié)構(gòu)定義:
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 '商品創(chuàng)建時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
下面是foods表對應(yīng)的golang結(jié)構(gòu)體類型
//商品
type Food struct {
Id int
Title string
Price float32
Stock int
Type int
//mysql datetime, date類型字段,可以和golang time.Time類型綁定, 詳細(xì)說明請參考:gorm連接數(shù)據(jù)庫章節(jié)。
CreateTime time.Time
}
//為Food綁定表名
func (v Food) TableName() string {
return "foods"
}
二、gorm更新記錄常用方法
1. Save
用于保存模型變量的值。
提示: 相當(dāng)于根據(jù)主鍵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模型對應(yīng)的表記錄
//等價于: 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參數(shù),使用的是Food{},新生成一個空白的模型變量,沒有綁定任何記錄。
//因為Food{}的id為空,gorm庫就不會以id作為條件,where語句就是空的
//例子3:
//根據(jù)自定義條件更新記錄,而不是根據(jù)主鍵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:
//通過結(jié)構(gòu)體變量設(shè)置更新字段
updataFood := Food{
Price:120,
Title:"檸檬雪碧",
}
//根據(jù)food模型更新數(shù)據(jù)庫記錄
//等價于: UPDATE `foods` SET `price` = '120', `title` = '檸檬雪碧' WHERE `foods`.`id` = '2'
//Updates會忽略掉updataFood結(jié)構(gòu)體變量的零值字段, 所以生成的sql語句只有price和title字段。
db.Model(&food).Updates(&updataFood)
//例子2:
//根據(jù)自定義條件更新記錄,而不是根據(jù)模型id
updataFood := Food{
Stock:120,
Title:"檸檬雪碧",
}
//設(shè)置Where條件,Model參數(shù)綁定一個空的模型變量
//等價于: UPDATE `foods` SET `stock` = '120', `title` = '檸檬雪碧' WHERE (price > '10')
db.Model(Food{}).Where("price > ?", 10).Updates(&updataFood)
//例子3:
//如果想更新所有字段值,包括零值,就是不想忽略掉空值字段怎么辦?
//使用map類型,替代上面的結(jié)構(gòu)體變量
//定義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)
提示: 通過結(jié)構(gòu)體變量更新字段值, gorm庫會忽略零值字段。就是字段值等于0, nil, “”, false這些值會被忽略掉,不會更新。如果想更新零值,可以使用map類型替代結(jié)構(gòu)體。
4. 更新表達(dá)式
UPDATE foods SET stock = stock + 1 WHERE id = '2'
這樣的帶計算表達(dá)式的更新語句gorm怎么寫?
gorm提供了Expr函數(shù)用于設(shè)置表達(dá)式
//等價于: 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)
到此這篇關(guān)于Gorm更新零值問題解決思路與過程的文章就介紹到這了,更多相關(guān)Gorm更新零值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go實現(xiàn)map轉(zhuǎn)json的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Go語言實現(xiàn)map轉(zhuǎn)json的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-09
go微服務(wù)PolarisMesh源碼解析服務(wù)端啟動流程
這篇文章主要為大家介紹了go微服務(wù)PolarisMesh源碼解析服務(wù)端啟動流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

