为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕森卡 2022-09-05 09:44:58
我对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来存储表。提前致谢!
查看完整描述

2 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

假设 您在 和 之间有一对一的关系,那么使用外键的一种方法是这样的: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_rolesusersroles


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


查看完整回答
反对 回复 2022-09-05
?
慕的地10843

TA贡献1785条经验 获得超8个赞

对于 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问题和文档


查看完整回答
反对 回复 2022-09-05
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号