我想User
在我的 Fiber/gorm 后端为我的对象启用更新功能。当我使用该函数一起更新所有字段时,它工作正常Save
。但是,当我在更新请求中没有所有字段(例如,只有Birthday
字段而不是Phone
字段)时,它会用它们各自的空值覆盖其余字段。
func UserUpdateByID(c *fiber.Ctx) error {
db := database.DBConn
// Parse the body to fit user entity
user := entities.User{}
if err := c.BodyParser(&user); err != nil {
return c.Status(500).SendString(err.Error())
}
// Update record
record := db.Save(&user)
if record.Error != nil {
return c.Status(500).SendString(record.Error.Error())
}
return c.JSON(record.Value)
当我将行更改record := db.Save(&user)
为
mappedData, _ := StructToMap(user)
record := db.Model(&entities.User{}).Update(mappedData)
我收到Update
无法处理接口映射的错误:sql: converting argument $10 type: unsupported type map[string]interface {}, a map
更新 1: 提到的 StructToMap 函数如下所示:
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
}
更新 2: 用户对象看起来像:
type User struct {
gorm.Model
Identity string
Birthday time.Time
Phone string
City string
...
ActivityData []Activity
}