[英]How to Add Choices to database field using GORM
我對 Golang 很陌生,因為我主要在 Python 中編寫代碼,所以遇到了一個我無法解決的問題。 如果可以的話,我想通過GORM或任何其他方式向 Golang Struct 中的字段添加選擇。
我的 model 看起來像這樣
type User struct{
FirstName string `gorm:"size:100" json:"first_name"`
LastName string `gorm:"size:100" json:"last_name"`
Email *string `gorm:"size:250;index;not null;index:email;unique" json:"email"`
Role string `gorm:"default:User;not null" json:"is_active"` // TODO Add Choice
}
我想從 ['Admin', 'User', 'Guest'] 向我的用戶模型中的角色字段添加選擇。 有沒有辦法使用 GORM 或任何其他可以解決我的問題的方法來實現它? 如果沒有直接的方法,我可以將其設為外鍵。 我正在使用 PostgreSQL 來存儲表格。 提前致謝!
對於PostGreSQL首先在數據庫中手動創建枚舉
CREATE TYPE user_access AS ENUM (
'admin',
'user'
);
然后
type Role string
const (
Admin Role = "admin"
User Role = "user"
)
func (r *Role) Scan(value interface{}) error {
*r = Role(value.([]byte))
return nil
}
func (r Role) Value() (driver.Value, error) {
return string(r), nil
}
type User struct{
ID int64 `json:"id"`
FirstName string `gorm:"size:100" json:"first_name"`
LastName string `gorm:"size:100" json:"last_name"`
Email *string `gorm:"size:250;index;not null;index:email;unique" json:"email"`
Role Role `sql:"type:user_access"` // PostGreSQL
Role Role `json:"role" sql:"type:ENUM('admin', 'user')"` // MySQL
}
假設您在roles
和users
之間有一對一的關系,使用外鍵的一種方法是這樣的:
type User struct{
ID int64 `json:"id"`
FirstName string `gorm:"size:100" json:"first_name"`
LastName string `gorm:"size:100" json:"last_name"`
Email *string `gorm:"size:250;index;not null;index:email;unique" json:"email"`
RoleID int64 `json:"role_id"`
Role *Role `json:"role"`
}
type Role struct {
ID int64 `json:"id"`
Name string `json:"name"`
}
//load data
var users []User
err := db.Preload("Role").Find(&users).Error
編輯:多對多關系的解決方案
假設您有一個類似users_roles
的表來鏈接users
和roles
表,一個解決方案可能如下所示:
type User struct{
ID int64 `json:"id"`
FirstName string `gorm:"size:100" json:"first_name"`
LastName string `gorm:"size:100" json:"last_name"`
Email *string `gorm:"size:250;index;not null;index:email;unique" json:"email"`
Roles []*Role `gorm:"many2many:users_roles;" json:"roles"`
}
type Role struct {
ID int64 `json:"id"`
Name string `json:"name"`
}
//load data
var users []User
err := db.Preload("Roles").Find(&users).Error
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.