您的位置:首页 > 房产 > 家装 > gorm存储json

gorm存储json

2024/10/5 22:27:36 来源:https://blog.csdn.net/Wksycxy/article/details/139859349  浏览:    关键词:gorm存储json

在一些存储配置文件的场景下,我们需要在mysql中存储json。最直接的方法是在存储时通过json.Marshall()序列化方法将需要存储的对象转化为json字符串,然后再存入mysql中。需要使用时,从mysql中取出,再进行json.Unmarshall()。具体操作如下:

type Record struct {Config string `json:"config" gorm:"column:config"` //
}func main() {// 存储示例config1 := map[string]any{"配置项1": 1,"配置项2": "二","配置项3": true,}tmp, _ := json.Marshal(config1)record1 := Record{Config: string(tmp),}db.Save(record1)// 使用示例record2 := Record{}db.Find(record2)config2 := map[string]any{}json.Unmarshal([]byte(record2.Config),config2)
}

每次进行类似的操作都需要进行转换,十分的繁琐。有没有一种办法能让存储和取出的过程中自动完成对象和json字符串之间的互换呢?
gorm提供了钩子函数,可以很好的解决这个问题。

Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数。
如果您已经为模型定义了指定的方法,它会在创建、更新、查询、删除时自动被调用。如果任何回调返回错误,GORM 将停止后续的操作并回滚事务。
钩子方法的函数签名应该是 func(*gorm.DB) error

以上面的操作为例,我们可以为其添加钩子函数,并修改结构体

type Record struct {Config    map[string]any `json:"config" gorm:"-"`RawConfig string         `json:"-" gorm:"column:config"`
}func (r *Record) BeforeSave(tx *gorm.DB) error {if r.Config != nil {tmp, err := json.Marshal(r.Config)if err != nil {return err}r.RawConfig = string(tmp)}return nil
}func (r *Record) AfterFind(tx *gorm.DB) error {if r.RawConfig != "" {err := json.Unmarshal([]byte(r.RawConfig), &r.Config)return err}return nil
}

这是我们在使用时直接操控Config即可完成操作,不需要再将数据进行转换

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com