#go #go-gin #sqlx
# #Вперед #go-gin #sqlx
Вопрос:
Я играю с gin-gonic sqlx. Теперь мне интересно, каков наилучший способ динамической привязки записей базы данных к структуре?
Скажем, у меня есть структура и запрос, подобный этому.
type Project struct {
ID string `db:"id"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
DeletedAt NullTime `db:"deleted_at"`
Name string
Status string
OpenDate NullTime `db:"open_date"`
Number uint
}
func (p Project) List() ([]Project, error) {
var pp []Project
err := db.Select(amp;pp, "SELECT * FROM Project")
return pp, err
}
Теперь я хочу добавить разрешения на уровне полей к этой структуре. Например, администратор может просматривать и редактировать все поля; Пользователь A может просматривать CreatedAt
и Name
; Пользователь B может просматривать, редактировать Name
Status
и просматривать Number
.
Я писал многократные структуры для каждого варианта использования, но, очевидно, я выбрал самый глупый способ. Другой метод, о котором я могу подумать, — это реализовать тег Struct . Я на правильном пути или есть лучший способ сделать это?
Комментарии:
1. Вы хотите, чтобы эти разрешения отражались в базе данных? Или только на уровне приложения?
2. @Flimzy только на уровне приложения. Все поля находятся в одной таблице
3. Хорошо. Это намного проще. Это также делает компонент SQL вопроса неактуальным (именно поэтому он проще!)
Ответ №1:
Мы можем создавать несколько структур и встраивать их друг в друга. Пример:
type ProjectSummary struct {
ID string `db:"id"`
Name string
}
type ProjectUser struct {
ProjectSummary
CreatedAt time.Time `db:"created_at"`
}
type ProjectSupport struct {
ProjectSummary
Status string
Number uint
}
type ProjectAdmin struct {
ProjectSupport
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
DeletedAt NullTime `db:"deleted_at"`
OpenDate NullTime `db:"open_date"`
}
Комментарии:
1. Да, это именно то, что я сейчас делаю. Я просто чувствую, что это как-то недостаточно элегантно. Потому что это нелегко отслеживать и изменять.