最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Gorm更新零值問(wèn)題解決思路與過(guò)程

 更新時(shí)間:2023年01月12日 09:23:21   作者:Ch3n  
這篇文章主要介紹了Gorm更新零值問(wèn)題解決思路與過(guò)程,總的來(lái)說(shuō)這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過(guò)程。希望通過(guò)這道題能給你帶來(lái)一種解題優(yōu)化的思路

一、前言

為方便描述教程例子,這里給出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 '商品價(jià)格',
  `stock` int(11) DEFAULT '0' COMMENT '商品庫(kù)存',
  `type` int(11) DEFAULT '0' COMMENT '商品類(lèi)型',
  `create_time` datetime NOT NULL COMMENT '商品創(chuàng)建時(shí)間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

下面是foods表對(duì)應(yīng)的golang結(jié)構(gòu)體類(lèi)型

//商品
type Food struct {
	Id         int
	Title      string
	Price      float32
	Stock      int
	Type       int
	//mysql datetime, date類(lèi)型字段,可以和golang time.Time類(lèi)型綁定, 詳細(xì)說(shuō)明請(qǐng)參考:gorm連接數(shù)據(jù)庫(kù)章節(jié)。
	CreateTime time.Time
}
//為Food綁定表名
func (v Food) TableName() string {
	return "foods"
}

二、gorm更新記錄常用方法

1. Save

用于保存模型變量的值。

提示: 相當(dāng)于根據(jù)主鍵id,更新所有模型字段值。

food := Food{}
//先查詢一條記錄, 保存在模型變量food
//等價(jià)于: SELECT * FROM `foods`  WHERE (id = '2') LIMIT 1
db.Where("id = ?", 2).Take(&food)
//修改food模型的值
food.Price = 100
//等價(jià)于: UPDATE `foods` SET `title` = '可樂(lè)', `type` = '0', `price` = '100', `stock` = '26', `create_time` = '2018-11-06 11:12:04'  WHERE `foods`.`id` = '2'
db.Save(&food)

2. Update

更新單個(gè)字段值

//例子1:
//更新food模型對(duì)應(yīng)的表記錄
//等價(jià)于: UPDATE `foods` SET `price` = '25'  WHERE `foods`.`id` = '2'
db.Model(&food).Update("price", 25)
//通過(guò)food模型的主鍵id的值作為where條件,更新price字段值。
//例子2:
//上面的例子只是更新一條記錄,如果我們要更全部記錄怎么辦?
//等價(jià)于: UPDATE `foods` SET `price` = '25'
db.Model(Food{}).Update("price", 25)
//注意這里的Model參數(shù),使用的是Food{},新生成一個(gè)空白的模型變量,沒(méi)有綁定任何記錄。
//因?yàn)镕ood{}的id為空,gorm庫(kù)就不會(huì)以id作為條件,where語(yǔ)句就是空的
//例子3:
//根據(jù)自定義條件更新記錄,而不是根據(jù)主鍵id
//等價(jià)于: 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

更新多個(gè)字段值

//例子1:
//通過(guò)結(jié)構(gòu)體變量設(shè)置更新字段
updataFood := Food{
		Price:120,
		Title:"檸檬雪碧",
	}
//根據(jù)food模型更新數(shù)據(jù)庫(kù)記錄
//等價(jià)于: UPDATE `foods` SET `price` = '120', `title` = '檸檬雪碧'  WHERE `foods`.`id` = '2'
//Updates會(huì)忽略掉updataFood結(jié)構(gòu)體變量的零值字段, 所以生成的sql語(yǔ)句只有price和title字段。
db.Model(&food).Updates(&updataFood)
//例子2:
//根據(jù)自定義條件更新記錄,而不是根據(jù)模型id
updataFood := Food{
		Stock:120,
		Title:"檸檬雪碧",
	}
//設(shè)置Where條件,Model參數(shù)綁定一個(gè)空的模型變量
//等價(jià)于: UPDATE `foods` SET `stock` = '120', `title` = '檸檬雪碧'  WHERE (price > '10')
db.Model(Food{}).Where("price > ?", 10).Updates(&updataFood)
//例子3:
//如果想更新所有字段值,包括零值,就是不想忽略掉空值字段怎么辦?
//使用map類(lèi)型,替代上面的結(jié)構(gòu)體變量
//定義map類(lèi)型,key為字符串,value為interface{}類(lèi)型,方便保存任意值
data := make(map[string]interface{})
data["stock"] = 0 //零值字段
data["price"] = 35
//等價(jià)于: UPDATE `foods` SET `price` = '35', `stock` = '0'  WHERE (id = '2')
db.Model(Food{}).Where("id = ?", 2).Updates(data)

提示: 通過(guò)結(jié)構(gòu)體變量更新字段值, gorm庫(kù)會(huì)忽略零值字段。就是字段值等于0, nil, “”, false這些值會(huì)被忽略掉,不會(huì)更新。如果想更新零值,可以使用map類(lèi)型替代結(jié)構(gòu)體。

4. 更新表達(dá)式

UPDATE foods SET stock = stock + 1 WHERE id = '2'

這樣的帶計(jì)算表達(dá)式的更新語(yǔ)句gorm怎么寫(xiě)?

gorm提供了Expr函數(shù)用于設(shè)置表達(dá)式

//等價(jià)于: 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)
//此時(shí)不會(huì)更新這些零值,如需更新零值使用map
userMap:=map[string]interface{}{
  "name":"",
  "age":0,
  "actived":0,
}
db.Model(&user).Updates(userMap)

到此這篇關(guān)于Gorm更新零值問(wèn)題解決思路與過(guò)程的文章就介紹到這了,更多相關(guān)Gorm更新零值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang中如何保證精度的方法

    golang中如何保證精度的方法

    本文主要介紹了golang中如何保證精度的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • GPT回答go語(yǔ)言和C語(yǔ)言map操作方法對(duì)比

    GPT回答go語(yǔ)言和C語(yǔ)言map操作方法對(duì)比

    這篇文章主要為大家介紹了GPT回答go語(yǔ)言和C語(yǔ)言map操作方法對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • golang如何實(shí)現(xiàn)三元運(yùn)算符功能

    golang如何實(shí)現(xiàn)三元運(yùn)算符功能

    這篇文章主要介紹了在其他一些編程語(yǔ)言中,如?C?語(yǔ)言,三元運(yùn)算符是一種可以用一行代碼實(shí)現(xiàn)條件選擇的簡(jiǎn)便方法,那么在Go語(yǔ)言中如何實(shí)現(xiàn)類(lèi)似功能呢,下面就跟隨小編一起學(xué)習(xí)一下吧
    2024-02-02
  • 深入理解Go Gin框架中間件的實(shí)現(xiàn)原理

    深入理解Go Gin框架中間件的實(shí)現(xiàn)原理

    在Go Gin框架中,中間件是一種在請(qǐng)求處理過(guò)程中插入的功能模塊,它可以用于處理請(qǐng)求的前置和后置邏輯,例如認(rèn)證、日志記錄、錯(cuò)誤處理等,本文將給大家介紹一下Go Gin框架中間件的實(shí)現(xiàn)原理,需要的朋友可以參考下
    2023-09-09
  • Go語(yǔ)言運(yùn)行環(huán)境安裝詳細(xì)教程

    Go語(yǔ)言運(yùn)行環(huán)境安裝詳細(xì)教程

    這篇文章主要介紹了Go語(yǔ)言運(yùn)行環(huán)境安裝詳細(xì)教程,本文講解了Linux、MAC OS、Windows下的安裝方法,同時(shí)講解了驗(yàn)證是否安裝成功、第三方工具安裝運(yùn)行環(huán)境的方法,需要的朋友可以參考下
    2014-10-10
  • golang協(xié)程設(shè)計(jì)及調(diào)度原理

    golang協(xié)程設(shè)計(jì)及調(diào)度原理

    這篇文章主要介紹了golang協(xié)程設(shè)計(jì)及調(diào)度原理,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • GoLang strings.Builder底層實(shí)現(xiàn)方法詳解

    GoLang strings.Builder底層實(shí)現(xiàn)方法詳解

    自從學(xué)習(xí)go一個(gè)月以來(lái),我多少使用了一下strings.Builder,略有心得。你也許知道它,特別是你了解bytes.Buffer的話。所以我在此分享一下我的心得,并希望能對(duì)你有所幫助
    2022-10-10
  • Golang+Vue輕松構(gòu)建Web應(yīng)用的方法步驟

    Golang+Vue輕松構(gòu)建Web應(yīng)用的方法步驟

    本文主要介紹了Golang+Vue輕松構(gòu)建Web應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Go語(yǔ)言中多字節(jié)字符的處理方法詳解

    Go語(yǔ)言中多字節(jié)字符的處理方法詳解

    這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中多字節(jié)字符的處理方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • golang使用sort接口實(shí)現(xiàn)排序示例

    golang使用sort接口實(shí)現(xiàn)排序示例

    這篇文章主要介紹了golang使用sort接口實(shí)現(xiàn)排序的方法,簡(jiǎn)單分析了sort接口的功能并實(shí)例演示了基于sort接口的排序?qū)崿F(xiàn)方法,需要的朋友可以參考下
    2016-07-07

最新評(píng)論

凌海市| 鹤峰县| 泰和县| 澎湖县| 和平县| 桦川县| 崇州市| 崇义县| 富宁县| 庐江县| 武定县| 漾濞| 吉水县| 修武县| 夏河县| 南京市| 曲沃县| 涞源县| 安达市| 林西县| 新乡市| 德庆县| 织金县| 汝城县| 武宣县| 宣威市| 中超| 抚宁县| 拉萨市| 大名县| 丰都县| 兴文县| 城口县| 法库县| 四川省| 盖州市| 云阳县| 保德县| 雅江县| 新巴尔虎右旗| 新泰市|