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

  • 相关阅读:
    ocr的场景应用--发票识别
    C++11的互斥包装器
    java毕业设计“小世界”私人空间mybatis+源码+调试部署+系统+数据库+lw
    linux中安装RocketMQ以及dashboard
    19_ue4蓝图通讯与自定义事件触发加速
    坦克大战Netty网络联机版项目笔记
    LeetCode·435.无重叠区间·贪心
    OpenCV(八)——基本线条操作
    站在开源云的新周期,EasyStack布局数字原生企业云
    Vue3较Vue2的更新内容(一)
  • 原文地址:https://blog.csdn.net/Wksycxy/article/details/139859349