0

我想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
}
4

1 回答 1

2

在 gorm 文档(https://gorm.io/docs/update.html)上,您可以执行以下操作:使用更新而不是更新。

db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})

您还可以使用db.Debug来显示 gorm 所做的最终查询,并查看是否与您期望的匹配。

于 2021-07-16T15:02:21.673 回答