golang-将枚举类型保存到SQL数据库中“紧急:sql:转换Exec参数1的类型:从Value返回的非Value类型的int”

在 Go 中,将枚举类型保存到 SQL 数据库中,出现 "sql: converting Exec argument # to Value type: int" 错误通常是因为数据库驱动程序无法识别 Go 中的自定义枚举类型,因此无法正确地将其映射到数据库字段。

解决方法:

  1. 使用整数存储枚举值

    • 一种常见的方法是在数据库中直接存储枚举类型的整数值。例如,如果你有一个枚举类型 Status,可以在数据库中使用 INT 类型的字段存储它的值。
    go
    type Status int const ( Pending Status = iota Approved Rejected ) // 将枚举类型存储为整数值 var status Status = Pending

    在数据库中的表定义可能如下所示:

    sql
    CREATE TABLE Example ( id SERIAL PRIMARY KEY, status INT );

    在 Go 中向数据库插入数据时,将枚举值转换为整数即可:

    go
    status := Pending // 例如,Pending 的枚举值 _, err := db.Exec("INSERT INTO Example (status) VALUES ($1)", status)
  2. 自定义类型实现 Scanner 和 Valuer 接口

    • 另一种方法是为自定义枚举类型实现 sql.Scannerdriver.Valuer 接口,以便能够自定义类型和数据库字段之间的转换。这种方法需要手动编写一些代码来处理类型转换。
    go
    type Status int const ( Pending Status = iota Approved Rejected ) // 实现 sql.Scanner 接口 func (s *Status) Scan(value interface{}) error { *s = Status(value.(int)) return nil } // 实现 driver.Valuer 接口 func (s Status) Value() (driver.Value, error) { return int(s), nil }

    然后在使用时:

    go
    status := Pending // 例如,Pending 的枚举值 _, err := db.Exec("INSERT INTO Example (status) VALUES ($1)", status)

    这样数据库驱动程序就能够正确地将 Status 类型的值映射到数据库中的字段。

注意事项:

  • 确保在与数据库交互时,Go 的类型与数据库字段类型能够匹配或进行正确的转换。
  • 需要引入正确的数据库驱动程序(例如 github.com/lib/pq 用于 PostgreSQL)并根据数据库的具体要求进行配置和实现。

通过以上方法,你应该能够解决将枚举类型保存到 SQL 数据库中出现的问题。