Golang Gorm 更新字段save、update、updates
更新和刪除操作的前提條件都是要在找到數(shù)據(jù)的情況下,先要查詢到數(shù)據(jù)才可以做操作。
更新的前提的先查詢到記錄,Save保存所有字段,用于單個(gè)記錄的全字段更新,它會(huì)??厮凶侄?,即使零值也會(huì)保存。
在更新和刪除之前,要利用之前學(xué)的查詢語(yǔ)句先查詢到數(shù)據(jù),再去更新,也就是使用find take先去查詢所需要的記錄,再去更新!
save 更新單條記錄并且更新所有字段
用于單條記錄的全部字段更新,它會(huì)保留所有字段,即使0值也會(huì)去更新。
db.Debug().Save(&s) UPDATE `student` SET `name`='test',`age`=60,`email`='123@qq.com' WHERE `id` = 7
可以看到會(huì)更新零值和多個(gè)字段。
var s Student db.Debug().Take(&s, "name = ?", "test") fmt.Println(s) s.Age = 60 db.Debug().Save(&s) fmt.Println(s) [1.423ms] [rows:1] SELECT * FROM `student` WHERE name = 'test' LIMIT 1 {7 test 110 0xc000209140} [5.531ms] [rows:1] UPDATE `student` SET `name`='test',`age`=60,`email`='123@qq.com' WHERE `id` = 7 {7 test 60 0xc000209140}
Save + Select 只更新某個(gè)字段
只更新某個(gè)字段 select + save select是字段的名字name,不是Name
var s Student db.Debug().Take(&s, "name = ?", "test") s.Age = 50 db.Debug().Select("age").Save(&s) fmt.Println(s) [2.220ms] [rows:1] SELECT * FROM `student` WHERE name = 'test' LIMIT 1 [8.689ms] [rows:1] UPDATE `student` SET `age`=50 WHERE `id` = 7
update 更新單個(gè)字段 find+update、take+update、model+where+update
model 是聲明映射關(guān)系的對(duì)象類型,通過(guò)這個(gè)對(duì)象類型,找到表名和字段
var s []Student db.Debug().Find(&s, []int{1, 2, 3}).Update("age", 10) fmt.Println(s) [1.258ms] [rows:3] SELECT * FROM `student` WHERE `student`.`id` IN (1,2,3) [7.232ms] [rows:3] UPDATE `student` SET `age`=10 WHERE `student`.`id` IN (1,2,3) AND `id` IN (1,2,3) [{1 lucas 10 <nil>} {2 lucas 10 <nil>} {3 10 <nil>}]
Take + Update
var s Student db.Debug().Take(&s, "name = ?", "lucas").Update("age", 18) UPDATE `student` SET `age`=18 WHERE name = 'lucas' AND `id` = 3 LIMIT 1
Model + Where + Update
model() 括號(hào)里面是一個(gè)結(jié)構(gòu)體指針,通過(guò)該結(jié)構(gòu)體找到對(duì)應(yīng)的表!
var s Student db.Debug().Model(&s).Where("name = ?", "lucas").Update("age", 106) [7.091ms] [rows:1] UPDATE `student` SET `age`=106 WHERE name = 'lucas'
更新多個(gè)字段 updates Model(&x{}) + Where + Updates
save是批量更新字段,但是想更新某個(gè)字段,updates可以接受結(jié)構(gòu)體類型和map類型。
updates之前,你必須先查找,你這里可以使用take + updates,find + updates,model + where等等,updates里面是具體的結(jié)構(gòu)體即可。
var s []Student db.Debug().Find(&s, []int{1, 2, 3}).Updates(&Student{Age: 66}) fmt.Println(s) [6.909ms] [rows:3] UPDATE `student` SET `age`=66 WHERE `student`.`id` IN (1,2,3) AND `id` IN (1,2,3) [{1 lucas 66 <nil>} {2 lucas 66 <nil>} {3 66 <nil>}]
var s []Student db.Debug().Find(&s, []int{1, 2, 3}).Updates(map[string]any{ "name": "lucas", }) [4.648ms] [rows:1] UPDATE `student` SET `name`='lucas' WHERE `student`.`id` IN (1,2,3) AND `id` IN (1,2,3) [{1 lucas 66 <nil>} {2 lucas 66 <nil>} {3 lucas 66 <nil>}]
實(shí)際使用中的一段代碼
if err := mysql.DB.Model(&model.Book{}).Where("id = ?", book.ID).Updates(book).Error; err != nil { logger.Error(fmt.Sprintf("更新book失敗:%v", err)) return errors.New(fmt.Sprintf("更新book失敗:%v", err)) }
到此這篇關(guān)于Golang Gorm 更新字段save、update、updates的文章就介紹到這了,更多相關(guān)Golang Gorm 更新字段內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
重學(xué)Go語(yǔ)言之錯(cuò)誤處理與異常機(jī)制詳解
Go語(yǔ)言的開(kāi)發(fā)者顯然覺(jué)得?try-catch被濫用了,因此?Go不支持使用?try-catch語(yǔ)句捕獲異常處理,那么,Go語(yǔ)言是如何定義和處理程序的異常呢,下面我們就來(lái)看看吧2023-08-08在golang中使用Sync.WaitGroup解決等待的問(wèn)題
這篇文章主要介紹了在golang中使用Sync.WaitGroup解決等待的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04