使用 GORM 自定义类型:解决问题与技巧分享

本文介绍了如何在Go语言的ORM库GORM中处理自定义类型SliceString,通过创建自定义类型并实现Scan和Value方法,以及在模型定义中使用GORM标签指定存储类型,确保数据的正确存储和读取。
摘要由CSDN通过智能技术生成

引言

在使用 Go 语言的 ORM 库 GORM 进行数据模型操作时,开发者经常会遇到如何处理自定义数据类型的问题。本文将基于一个具体的例子 —— SliceString 类型,分享如何在 GORM 中处理自定义类型的字段,并通过设置 GORM 标签来指定类型,以确保数据的正确存取。

问题背景

在 GORM 的实际使用中,直接使用如 []string 这样的 Go 基本类型作为模型字段时,往往会因为数据类型不被直接支持而遇到错误。例如,直接存储和读取切片类型可能会引发诸如 unsupported data type 的错误。

自定义类型的实现

为了在数据库中正确处理 []string,可以创建一个自定义类型 SliceString,并为它实现 ScanValue 方法,使其能够在 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"`
}

在这个模型中,IdsIds2 通过指定 type:json 标签,明确告诉 GORM 这两个字段应以 JSON 格式存储。

结语

通过上述的方法,可以有效地解决 GORM 中自定义类型的处理问题,确保数据的正确存取。希望本文能帮助到面临类似问题的 GORM 用户。

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deng_Xian_Shemg

捐助1元钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值