gorm存储json

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

go 复制代码
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

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

go 复制代码
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即可完成操作,不需要再将数据进行转换

相关推荐
ZhongruiRao5 小时前
Springboot+PostgreSQL+MybatisPlus存储JSON或List、数组(Array)数据
spring boot·postgresql·json
华农第一蒟蒻6 小时前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token
胡耀超7 小时前
知识图谱入门——8: KG开发常见数据格式:OWL、RDF、XML、GraphML、JSON、CSV。
xml·json·知识图谱·csv·owl·graphml·gml
x-cmd11 小时前
[241005] 14 款最佳免费开源图像处理库 | PostgreSQL 17 正式发布
数据库·图像处理·sql·安全·postgresql·开源·json
先知demons18 小时前
js将对象的键和值分别归纳进对象,并将多层对象转化成数据的方法
javascript·vue.js·json
Midsummer啦啦啦1 天前
Python字符串转JSON格式指南
开发语言·python·json
前端 贾公子1 天前
Express内置的中间件(express.json和express.urlencoded)格式的请求体数据
中间件·json·express
迷失蒲公英2 天前
在线JSON可视化工具--支持缩放
json·在线json可视化·在线json格式化
bug菌¹4 天前
滚雪球学MySQL[8.3讲]:数据库中的JSON与全文检索详解:从数据存储到全文索引的高效使用
数据库·mysql·json·全文索引
GDAL4 天前
Efficiently Convert Shapefiles to Protocol Buffers and JSON with Shp2pb
json