原始問題在 GORM 中使用該Update方法時(shí),不會(huì)保存新數(shù)據(jù)。即我想設(shè)置一個(gè)boolfrom trueto false,但即使在Update方法之后它仍然保持真實(shí)。在該方法的描述中有一條警告:“使用結(jié)構(gòu)更新時(shí)警告,GORM 不會(huì)更新零值的字段”由于我使用結(jié)構(gòu)來更新并且false是 的零值bool,這似乎是預(yù)期的行為,但我看不出有任何理由這樣做以及如何克服這一點(diǎn)。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)}解決方案總結(jié)new首先,正如建議的那樣,我在實(shí)例化結(jié)構(gòu)時(shí)省略了關(guān)鍵字。然后,我使用了一個(gè)輔助函數(shù)(從這里開始)將結(jié)構(gòu)轉(zhuǎn)換為映射,同時(shí)將 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}然后我循環(huán)遍歷數(shù)據(jù)切片中的每個(gè)元素,以便對(duì)其進(jìn)行轉(zhuǎn)換并一一更新: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)}*在這個(gè)例子中,錯(cuò)誤處理明顯減少了。
1 回答

眼眸繁星
TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
來自官方文檔
注意使用 struct 更新時(shí),GORM 只會(huì)更新非零字段,您可能希望使用 map 更新屬性或使用 Select 指定要更新的字段
因此map[string]interface{}
也用于更新非零字段。例子:
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
由于您已經(jīng)擁有 struct ,因此您可以轉(zhuǎn)換struct
為map[string]interface{}
(請參閱有關(guān)轉(zhuǎn)換的詳細(xì)信息)然后更新。另一種方法是將字段類型更改為指針。
- 1 回答
- 0 關(guān)注
- 358 瀏覽
添加回答
舉報(bào)
0/150
提交
取消