You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:05:26