如何使用 GORM 将选项添加到数据库字段

How to Add Choices to database field using GORM

我是 Golang 的新手,因为我主要使用 Python 编写代码,所以遇到了一个我无法解决的问题。我想通过 GORM 或任何其他方式向 Golang Struct 中的字段添加选择,如果我能实现的话。

我的模型是这样的

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 来存储表。提前致谢!

假设您在 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 这样的 table 链接 usersroles table,一个解决方案可能如下所示:

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

对于 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 issue and doc