引言
在使用 Go 语言的 ORM 库 GORM 进行数据模型操作时,开发者经常会遇到如何处理自定义数据类型的问题。本文将基于一个具体的例子 —— SliceString
类型,分享如何在 GORM 中处理自定义类型的字段,并通过设置 GORM 标签来指定类型,以确保数据的正确存取。
问题背景
在 GORM 的实际使用中,直接使用如 []string
这样的 Go 基本类型作为模型字段时,往往会因为数据类型不被直接支持而遇到错误。例如,直接存储和读取切片类型可能会引发诸如 unsupported data type
的错误。
自定义类型的实现
为了在数据库中正确处理 []string
,可以创建一个自定义类型 SliceString
,并为它实现 Scan
和 Value
方法,使其能够在 GORM 中作为一个可正常读写的字段。以下是实现的代码示例:
type SliceString []string
func (a *SliceString) Scan(src any) error {
jsonB, ok := src.([]byte)
if !ok {
return errors.New("source is not a byte array")
}
if !json.Valid(jsonB) {
return errors.New("invalid json data")
}
return json.Unmarshal(jsonB, a)
}
func (a SliceString) Value() (driver.Value, error) {
if len(a) == 0 {
return nil, nil
}
jStr, err := json.Marshal(a)
if err != nil {
return nil, err
}
return []byte(jStr), nil
}
这段代码使 SliceString
能够接受来自数据库的 JSON 格式的数据并将其反序列化,同时也可以将其序列化回 JSON 格式以存储到数据库。
解决问题
当使用自定义类型时,还需要在模型定义中通过 GORM 标签明确字段的存储类型,这样 GORM 就可以正确地处理这些字段。例如:
type Demo struct {
ID string `gorm:"primaryKey"`
Ids SliceString `gorm:"type:json"`
Ids2 SliceString `gorm:"type:json"`
}
在这个模型中,Ids
和 Ids2
通过指定 type:json
标签,明确告诉 GORM 这两个字段应以 JSON 格式存储。
结语
通过上述的方法,可以有效地解决 GORM 中自定义类型的处理问题,确保数据的正确存取。希望本文能帮助到面临类似问题的 GORM 用户。