为了账号安全,请及时绑定邮箱和手机立即绑定

创建 GORM 自定义数据类型,如何在扫描中获取上下文?

创建 GORM 自定义数据类型,如何在扫描中获取上下文?

Go
慕尼黑的夜晚无繁华 2022-07-11 14:55:31
我正在尝试编写 Gorm 自定义数据类型:https ://gorm.io/docs/data_types.htmltype MyDataType struct {}func (f *MyDataType) Scan(value interface{}) error {    //}func (f MyDataType) Value() (driver.Value, error) {    //}由于某些原因,我需要访问上下文Scan或能够检索字段标签。有没有办法做到这一点 ?谢谢
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

值基于用户空间,您可能需要将代码更改为:


type MyDataType struct {}


func (f *MyDataType) Scan(context context.Context, value interface{}) error {

    // proceed the context right there

}


func (f MyDataType) Value() (driver.Value, error) {

    //

}


查看完整回答
反对 回复 2022-07-11
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

您不能更改参数func Scan或func Value尝试这样做会破坏MyDataType'sql.Scanner和sql.Valuer实施。


可以通过嵌入来context.Context完成MyDataType。


type MyDataType struct {

    context.Context

}


func (f *MyDataType) Scan(value interface{}) error {

    ctx := context.Background()

    ctx = context.WithValue(ctx, "key", value)

    f.Context = ctx

    return nil

}


func (f MyDataType) Value() (driver.Value, error) {

    value := f.Context.Value("key")

    return value, nil

}


查看完整回答
反对 回复 2022-07-11
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

您需要访问什么上下文?

Scan(...) 用于将数据库原始数据转换为您的自定义字段类型。你应该知道格式。

Value() 是另一种方式,它将您的自定义字段转换为应放置在数据库中的任何内容。


查看完整回答
反对 回复 2022-07-11
  • 3 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信