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

不受支持的数据类型:自定义 Valuer 返回 nil 的 GORM 字段上的 &[] 错误?

不受支持的数据类型:自定义 Valuer 返回 nil 的 GORM 字段上的 &[] 错误?

Go
吃鸡游戏 2022-07-04 10:03:09
我试图为 postgres 数据库创建一个 GORM 模型,其中包含一个自定义类型Scanner,Valuer并将字符串切片与字符串转换,以保存为单个数据库列。如果切片为空或 nil,我希望数据库列也为 nil(而不是空字符串)。type MultiString []stringfunc (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: &[]
查看完整描述

1 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

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


模型中的标记


type MyModel struct {

    ...

    MyText MultiString `gorm:"type:text"`

}

这告诉 GORM 使用textDB 列类型的类型。使用此策略,每次在模型中使用新类型时都必须应用标记。


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 ""

}

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


查看完整回答
反对 回复 2022-07-04
  • 1 回答
  • 0 关注
  • 211 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信