Как определить, какие столбцы таблицы базы данных необходимо обновить из измененной структуры?

#go

#Вперед

Вопрос:

Проблема, с которой я сталкиваюсь, скорее связана с дизайном кода, чем конкретно с go. Я создаю простое CRUD-приложение, и, кажется, все идет хорошо и легко, за исключением части обновления: у меня есть тип структуры, такой простой, как:

 type User struct {
   ID string
   Name string
   Password string
}
  

и интерфейс для уровня хранения данных:

 type Store interface {
    ...
    Update(user *User) error
    ...
}
  

Проблема в том, что с большинством драйверов баз данных вы не можете просто передать экземпляр struct целиком и надеяться, что их система знает, какие поля были изменены, весь документ / строка заменяется. Как я должен отслеживать, какие поля были изменены (чтобы я мог соответствующим образом обновить их на уровне хранилища)? Может быть, передать все поля, которые я хотел бы изменить, в функцию обновления в виде карты интерфейса{}?

Комментарии:

1. В зависимости от вашей структуры может быть дороже выяснить, что изменилось, чем просто записать всю запись

2. Ознакомьтесь с gorm , хотя у него также есть свои ограничения / проблемы.

3. Я просто пишу свою функцию обновления, чтобы обновить все, кроме пароля. В обработчике я получаю запись, сканирую строку в struct, перенаправляю запрос JSON в эту структуру (перезаписывая значения DB значениями из тела запроса, если они присутствуют), затем передаю struct методу update для сохранения..

Ответ №1:

Существует множество способов добиться этого. Например, вы можете использовать установщики для изменения значений.Таким образом, вы можете отслеживать обновленные поля. вот так :

 type User struct {
   ID string
   Name string
   Password string
   updateFields map[string]bool
}

func (u *User) SetName(name string) {
   u.Name = name
   updateFields["name"] = true
}
  

Вы можете использовать более автоматизированный способ путем отражения.