gpt4 book ai didi

postgresql - 不支持的数据类型 : &[] error on GORM field where custom Valuer returns nil?

转载 作者:行者123 更新时间:2023-12-01 22:20:06 29 4
gpt4 key购买 nike

我正在尝试为 postgres 数据库创建一个 GORM 模型,其中包含一个带有自定义 Scanner 的类型和 Valuer它将字符串 slice 与字符串转换,以保存为单个数据库列。如果 slice 为空或 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: &[]

最佳答案

Value方法,替换返回的nilsql.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 ""
    }
    如果您使用的数据库类型之间的数据类型不同,则此选项很有用。

    关于postgresql - 不支持的数据类型 : &[] error on GORM field where custom Valuer returns nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64035165/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com