#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
}
Вы можете использовать более автоматизированный способ путем отражения.