日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Gorm更新零值問題解決思路與過程_Golang

作者:Ch3n ? 更新時間: 2023-03-01 編程語言

一、前言

為方便描述教程例子,這里給出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

欄目分類
最近更新