Частичное обновление объектов
Я хочу включить функцию обновления для своего
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, и посмотреть, соответствует ли он тому, что вы ожидаете.