簡體   English   中英

如何使用 GORM 將選項添加到數據庫字段

[英]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
}

有關更多信息,您可以查看github 問題文檔

假設您在rolesusers之間有一對一的關系,使用外鍵的一種方法是這樣的:

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的表來鏈接usersroles表,一個解決方案可能如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM