【问题标题】:How can i add enum in gorm?如何在gorm中添加枚举?
【发布时间】:2021-08-03 13:48:30
【问题描述】:

我正在编写 PostgreSQL 表架构。

type TestTable struct {
    ID        int    `gorm:"column:id;primaryKey;autoIncrement"`
    CarType   string `gorm:"column:car_type"`
}

那么我如何将“SEDAN”、“HATCHBACK”、“MINIVAN”等汽车类型添加为枚举数据类型

【问题讨论】:

标签: go go-gorm


【解决方案1】:

假设您使用的是 GORM。首先在您的数据库中创建一个类型。

CREATE TYPE car_type AS ENUM (
    'SEDAN',
    'HATCHBACK',
    'MINIVAN');

然后你需要定义以下模型:

type carType string

const (
    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"
}

【讨论】:

  • 感谢 Nick 的回复,但不支持 Enum 数据类型吗?我们如何处理其他数据类型,如数字等。在这种情况下,我需要先编写原始查询以在 DB 中创建枚举类型。
  • 你是对的。语言中没有给出enum 的数据类型,但我们可以表示它。按照以下问题的前 3 个回答,它将帮助您理解 golang 中的enumsstackoverflow.com/questions/14426366/… 另一方面,我认为您可以尝试不在数据库中创建enum。但是如果数据库中没有enum,您将冒着将数据库中的非常量值解析为程序中的常量的风险。我认为这是不安全的。
  • 我遵循了相同的步骤,并从这个答案所基于的主要 github 问题中引用了它,但对我来说,这行 => CarType carType sql:"car_type" 只是创建一个文本(字符串)列在 postgres 数据库中,我已经在我的数据库中创建了枚举。我什么都试过了,没有报错,不知道是什么问题。有相同问题或解决方法的人请回复。
【解决方案2】:

为了扩展尼克的回答,我将添加以下内容以实现自动化:

假设你有DBClient struct,你可以创建一个方法来创建这个汽车类型:

func (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
    }
}

【讨论】:

    【解决方案3】:

    附带说明 - 如果您决定采用稍微不同的方法: 您可以将枚举定义为 int,并利用 iota。然后您可以使用代码生成器创建 sql Scaner/Valuer 以及 json/文本表示。 例如: https://github.com/dmarkham/enumer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2014-10-20
      • 2015-12-12
      • 1970-01-01
      相关资源
      最近更新 更多