postgresql - 不受支持的数据类型:自定义 Valuer 返回 nil 的 GORM 字段上的 &[] 错误?
问题描述
我试图为 postgres 数据库创建一个 GORM 模型,其中包含一个自定义类型Scanner
,Valuer
并将字符串切片与字符串转换,以保存为单个数据库列。如果切片为空或 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
方法中,将返回的替换为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 ""
}
如果您使用的数据库类型之间的数据类型不同,则此选项很有用。
推荐阅读
- java - 从 Vertx 中的现有路由器生成 OpenApi 规范
- c - 在 Linux 上触发 C 应用程序的完全关闭
- java - 如何断言页面是否显示
- node.js - REST API 在 Node.js&Mongoose 中不起作用
- c# - 在 Unity / C# 中,.Net 的 async/await 是否从字面上开始另一个线程?
- c++11 - 有没有办法从外部控制 C++ 代码流?
- css - 忽略 vscode live sass 编译器中的一些 .scss 文件
- linux - 如何创建自己的 linux 显示驱动程序
- hash - 如何仅从命令行获取哈希?
- windows - 有人可以告诉我这个 FOR 循环有什么问题吗?