亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

更新方法不更新零值

更新方法不更新零值

Go
至尊寶的傳說 2022-07-11 10:37:26
原始問題在 GORM 中使用該Update方法時,不會保存新數據。即我想設置一個boolfrom trueto false,但即使在Update方法之后它仍然保持真實。在該方法的描述中有一條警告:“使用結構更新時警告,GORM 不會更新零值的字段”由于我使用結構來更新并且false是 的零值bool,這似乎是預期的行為,但我看不出有任何理由這樣做以及如何克服這一點。func UpdateData(c *fiber.Ctx) error {    db := database.DBConn    data := new([]entities.Data)    if err := c.BodyParser(&data); err != nil {        return err    }    db.Update(&data)    return c.JSON(data)}解決方案總結new首先,正如建議的那樣,我在實例化結構時省略了關鍵字。然后,我使用了一個輔助函數(從這里開始)將結構轉換為映射,同時將 json 別名作為鍵:// StructToMap Converts a struct to a map while maintaining the json alias as keysfunc StructToMap(obj interface{}) (newMap map[string]interface{}, err error) {    data, err := json.Marshal(obj)    if err != nil {        return    }    err = json.Unmarshal(data, &newMap) // Convert to a map    return}然后我循環遍歷數據切片中的每個元素,以便對其進行轉換并一一更新:func UpdateData(c *fiber.Ctx) error {    db := database.DBConn    data := []entities.Dard{}    if err := c.BodyParser(&data); err != nil {        return err    }    for _, record := range data {        mappedData, _ := StructToMap(record)        db.Model(&entities.Data{}).Update(mappedData)    }    return c.JSON(data)}*在這個例子中,錯誤處理明顯減少了。
查看完整描述

1 回答

?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

來自官方文檔

注意使用 struct 更新時,GORM 只會更新非零字段,您可能希望使用 map 更新屬性或使用 Select 指定要更新的字段

因此map[string]interface{}也用于更新非零字段。例子:

db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})

由于您已經擁有 struct ,因此您可以轉換structmap[string]interface{}請參閱有關轉換的詳細信息)然后更新。另一種方法是將字段類型更改為指針。


查看完整回答
反對 回復 2022-07-11
  • 1 回答
  • 0 關注
  • 546 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號