【问题标题】:unsupported data type: &[] error on GORM field where custom Valuer returns nil?不受支持的数据类型:自定义 Valuer 返回 nil 的 GORM 字段上的 &[] 错误?
【发布时间】:2020-09-23 19:39:09
【问题描述】:

我试图为 postgres 数据库创建一个 GORM 模型,其中包含一个具有自定义 ScannerValuer 的类型,可将字符串切片与字符串转换,以保存为单个数据库列。如果切片为空或 nil,我希望数据库列也为 nil(而不是空字符串)。

type MultiString []string

func (s *MultiString) Scan(src interface{}) error {
    str, ok := src.(string)
    if !ok {
        return errors.New("failed to scan multistring field - source is not a string")
    }
    *s = strings.Split(str, ",")
    return nil
}

func (s MultiString) Value() (driver.Value, error) {
    if s == nil || len(s) == 0 {
        return nil, nil
    }
    return strings.Join(s, ","), nil
}

当我尝试在以下结构上调用 AutoMigrate 时出现问题:

type Person struct {
    ID      int
    Name    string
    Kids    *MultiString
}

我多次收到以下错误:

[error] unsupported data type: &[]

【问题讨论】:

    标签: postgresql go go-gorm


    【解决方案1】:

    Value 方法中,将返回的nil 替换为sql.NullString{} - 这是不正确的,因为Value 不应返回另一个Valuer

    问题是 GORM 不确定新定义的类型的数据类型应该是什么,所以它试图弄清楚。相反,应该明确定义类型,可以在模型中使用 标签 或通过在新类型上实现 gorm 方法

    模型中的标签

    type MyModel struct {
        ...
        MyText MultiString `gorm:"type:text"`
    }
    

    这告诉 GORM 使用类型 text 作为 DB 列类型。使用这种策略,每次在模型中使用新类型时都必须应用标签。

    GORM 方法

    可以在新数据类型上实现两个 GORM 方法来告诉 GORM 应该使用哪种数据库类型:

    • GormDataType() string
    • GormDBDataType(db *gorm.DB, field *schema.Field) string

    例子:

    func (MultiString) GormDataType() string {
      return "text"
    }
    
    func (MultiString) GormDBDataType(db *gorm.DB, field *schema.Field) string {
    
      // returns different database type based on driver name
      switch db.Dialector.Name() {
      case "mysql", "sqlite":
        return "text"
      }
      return ""
    }
    

    如果您使用的数据库类型之间的数据类型不同,此选项很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多