如何在 gorm 中添加枚举?

我正在编写后greSQL表架构。


type TestTable struct {

    ID        int    `gorm:"column:id;primaryKey;autoIncrement"`

    CarType   string `gorm:"column:car_type"`

}

那么我怎么能添加汽车类型,如“轿车”,“掀背车”,“小型货车”作为枚举数据类型


宝慕林4294392
浏览 304回答 4
4回答

POPMUISE

假设您正在使用戈尔姆。首先在数据库中创建一个类型。CREATE TYPE car_type AS ENUM (    'SEDAN',    'HATCHBACK',    'MINIVAN');然后,您需要定义以下模型:import "database/sql/driver"type carType stringconst (    SEDAN  carType = "SEDAN"    HATCHBACK carType = "HATCHBACK"    MINIVAN carType = "MINIVAN")func (ct *carType) Scan(value interface{}) error {    *ct = carType(value.([]byte))    return nil}func (ct carType) Value() (driver.Value, error) {    return string(ct), nil}type MyTable struct {    gorm.Model    CarType carType `sql:"car_type"`}func (MyTable) TableName() string {    return "my_table"}

明月笑刀无情

在旁注中 - 如果您决定采用稍微不同的方法:您可以将枚举定义为int,并利用.然后,您可以使用代码生成器来创建sql,也可以创建json /文本表示形式。例如:https://github.com/dmarkham/enumeriotaScaner/Valuer

吃鸡游戏

为了扩展Nick的答案,我为自动化添加了以下内容:假设您有结构,则可以创建一个创建此汽车类型的方法:DBClientfunc (psqlClient *DBClient) CreateCarTypeEnum() error {    result := psqlClient.db.Exec("SELECT 1 FROM pg_type WHERE typname = 'car_type';")    switch {    case result.RowsAffected == 0:        if err := psqlClient.db.Exec("CREATE TYPE car_type AS ENUM ('SEDAN', 'HATCHBACK', 'MINIVAN');").Error; err != nil {            log.Error().Err(err).Msg("Error creating car_type ENUM")            return err        }        return nil    case result.Error != nil:        return result.Error    default:        return nil    }}

撒科打诨

更新,它将不工作,而是使用 。一旦您在数据库中手动创建了自定义枚举类型,也是如此。sql:"car_type"gorm:"car_type"
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go