Частичное обновление объектов

Я хочу включить функцию обновления для своего Userобъект в моем бэкэнде fiber/gorm. Он отлично работает, когда я обновляю все поля вместе, используя Saveфункция. Однако, когда у меня нет всех полей в запросе на обновление (например, только Birthday поле, но не Phone field) он перезаписывает остальные поля соответствующими нулевыми значениями.

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: объект User выглядит так:

type User struct {
  gorm.Model
  Identity  string
  Birthday time.Time
  Phone string
  City string
  ...
  ActivityData         []Activity
}

1 ответ

Глядя на документ gorm (https://gorm.io/docs/update.html), вы можете сделать что-то вроде этого: используйте обновления вместо обновления.

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

Вы также можете использовать db.Debug , чтобы показать окончательный запрос, сделанный gorm, и посмотреть, соответствует ли он тому, что вы ожидаете.

Другие вопросы по тегам