gorm結(jié)構(gòu)體零值不更新問題及解決方案
問題描述
在使用gorm的時(shí)候如果用結(jié)構(gòu)體進(jìn)行update或者updates會(huì)出現(xiàn)零值、空值不更新的問題,常見的辦法有兩種:
1.使用Save(),但是Save會(huì)保存所有字段,也就是說,必須將所有字段信息全部獲取才能更新,否則沒有傳值的字段會(huì)更新成空。
2.使用map接口,即map[string]interface{},但是當(dāng)我們使用的是protobuf定義了的結(jié)構(gòu)時(shí),轉(zhuǎn)換成map有些許麻煩。
那么該如何解決呢?
解決辦法
合理結(jié)合結(jié)構(gòu)體和map來達(dá)到可以更新0值的結(jié)果。由于在傳入字段的時(shí)候如果為0值或者空值會(huì)被gorm自動(dòng)忽略,所以在傳入的時(shí)候注意需要傳入一個(gè)可判斷的字段,
例如我在這里讓前端傳的是“無”這個(gè)字符串,判斷是否為“無”字符串,如果是,那么新建一個(gè)map[string]interface{}包含number并賦值為空(或者0)。
然后正常將其他字段更新一遍,再通過map將零/空值字段進(jìn)行更新保存。
var null sql.NullString
if object.Number == "無" {
values := map[string]interface{}{
"id": objectTmp.Id,
"number": null.String,
}
repo.db.Model(&object).Update(objectTmp)//正常更新一遍
repo.db.Model(&object).Update(values)//將為0值的字段更新一遍
}注意:
1. gorm不能傳nil到數(shù)據(jù)庫,只能傳空字符串,所以在數(shù)據(jù)庫里保存的是空字符串。
2. 更新單行數(shù)據(jù)一定要在map里面加上主鍵賦值,否則會(huì)批量更新,在我這里是id。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Golang使用ReverseProxy實(shí)現(xiàn)反向代理的方法
本文介紹了如何使用Golang的ReverseProxy實(shí)現(xiàn)反向代理,包括源碼結(jié)構(gòu)解析和官方單機(jī)示例NewSingleHostReverseProxy,同時(shí)指出,若要實(shí)現(xiàn)負(fù)載均衡,需要自行開發(fā),還提供了一個(gè)簡單的HTTP服務(wù)用于測試,感興趣的朋友跟隨小編一起看看吧2024-09-09
Go開發(fā)go-optioner工具實(shí)現(xiàn)輕松生成函數(shù)選項(xiàng)模式代碼
go-optioner?是一個(gè)在?Go?代碼中生成函數(shù)選項(xiàng)模式代碼的工具,可以根據(jù)給定的結(jié)構(gòu)定義自動(dòng)生成相應(yīng)的選項(xiàng)代碼,下面就來聊聊go-optioner是如何使用的吧2023-07-07
go語言題解LeetCode506相對(duì)名次示例詳解
這篇文章主要為大家介紹了go語言題解LeetCode506相對(duì)名次示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
go中使用curl實(shí)現(xiàn)https請(qǐng)求的示例代碼
本文主要介紹了go中使用curl實(shí)現(xiàn)https請(qǐng)求的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-06-06
golang time包做時(shí)間轉(zhuǎn)換操作
這篇文章主要介紹了golang time包做時(shí)間轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
GOLang判斷進(jìn)程是否存在實(shí)現(xiàn)方式
該文主要介紹了使用Go語言編寫進(jìn)程檢測工具的方法,由于Go語言本身沒有直接獲取進(jìn)程信息的功能,作者決定通過執(zhí)行命令的方式實(shí)現(xiàn),最終給出了優(yōu)化后的代碼示例2026-04-04
Go語言開發(fā)實(shí)現(xiàn)一個(gè)圖片批量壓縮工具
在日常開發(fā)和辦公中,圖片體積過大會(huì)帶來不少困擾,本文將使用Go語言編寫一個(gè)圖片批量壓縮工具,文中的示例代碼講解詳細(xì),需要的可以了解下2025-09-09

