原始问题
当使用Update
GORM 中的方法新数据不会被保存。即我想设置一个bool
from true
to false
,但即使在Update
method.
在该方法的描述中有一个警告:“警告当更新结构时,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
实例化结构时的关键字。然后,我使用了一个辅助函数(来自here https://stackoverflow.com/a/59756527/11465355)用于将结构转换为映射,同时保留 json 别名作为键:
// StructToMap Converts a struct to a map while maintaining the json alias as keys
func 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)
}
*在此示例中,错误处理明显减少。