使用GORM遇“unsupported data type: &[]”错误,是否该用datatypes?
问题描述
定义了如下GORM结构体:
type Datasource struct { gorm.Model Inputs []string `gorm: serializer:json` Outputs []string `gorm: serializer:json` Parameters map[string]interface{} `gorm: serializer:json` }
通过以下函数初始化数据库连接并执行迁移:
func ConnectDatabase() { database, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("Failed to connect to database!") } err = database.AutoMigrate(&Datasource{}) if err != nil { return } inputs := []string{"input_1", "input_2", "input_3"} outputs := []string{"output_1"} parameters := map[string]interface{}{"host": "here.it.is", "port": 8090} database.Create(&Datasource{Inputs: inputs, Outputs: outputs, Parameters: parameters}) DB = database }
执行时触发错误:
[error] unsupported data type: &[]
是否应该使用datatypes解决?
解决方案
1. 先修正GORM标签语法错误
你当前的GORM标签写法不符合Go语法规范,正确格式应为gorm:"serializer:json"(键值对需用双引号包裹)。错误的标签导致GORM无法识别序列化规则,这是触发错误的核心原因之一。
修正后的结构体:
import "gorm.io/gorm" type Datasource struct { gorm.Model Inputs []string `gorm:"serializer:json"` Outputs []string `gorm:"serializer:json"` Parameters map[string]interface{} `gorm:"serializer:json"` }
2. 两种可行的处理方式
针对SQLite不原生支持数组、map类型的问题,有两种解决方案:
方式一:使用GORM Serializer自动序列化
修正标签后,GORM会自动将[]string和map[string]interface{}序列化为JSON字符串存储,查询时再自动反序列化为对应类型。你的Create逻辑无需额外修改,可直接复用原有代码。
方式二:使用GORM datatypes.JSON类型
如果需要更明确的数据库类型控制,或兼容更多数据库场景,可改用datatypes.JSON类型:
首先导入依赖包:
import ( "gorm.io/gorm" "gorm.io/datatypes" "encoding/json" )
修改结构体定义:
type Datasource struct { gorm.Model Inputs datatypes.JSON `gorm:"type:text"` Outputs datatypes.JSON `gorm:"type:text"` Parameters datatypes.JSON `gorm:"type:text"` }
赋值时需手动将数组、map序列化为JSON字节:
inputs, _ := json.Marshal([]string{"input_1", "input_2", "input_3"}) outputs, _ := json.Marshal([]string{"output_1"}) params, _ := json.Marshal(map[string]interface{}{"host": "here.it.is", "port": 8090}) database.Create(&Datasource{Inputs: inputs, Outputs: outputs, Parameters: params})
总结
优先修正标签语法错误,之后可根据需求选择自动序列化(Serializer)或显式JSON类型(datatypes)两种方案,都能解决当前的迁移错误。
内容的提问来源于stack exchange,提问作者tog
相关产品推荐
相关产品推荐

