gorm中正确的使用json数据类型

一、说明

  • 1、JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前,只能通过字符类型(CHARVARCHARTEXT )来保存 JSON 文档。现实中也很多人不会采用json的存储方式,直接定义一个字符类型,让前端转换传递进来,返回给前端也是一个字符串,前端自己处理

  • 2、json数据类型参考文档

  • 3、创建一个数据表

    CREATE TABLE `report` (
      `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
      `query_param` json NOT NULL,
      `name` varchar(50) DEFAULT NULL,
      `created_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
      `updated_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
      `deleted_at` timestamp(6) NULL DEFAULT NULL COMMENT '软删除时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    

二、gorm中使用json方式一

  • 1、自定义数据类型

    // JSON 自定义JSON数据类型
    type JSON []byte
    
    func (j JSON) Value() (driver.Value, error) {
    	if j.IsNull() {
    		return nil, nil
    	}
    	return string(j), nil
    }
    func (j *JSON) Scan(value interface{}) error {
    	if value == nil {
    		*j = nil
    		return nil
    	}
    	s, ok := value.([]byte)
    	if !ok {
    		errors.New("invalid Scan Source")
    	}
    	*j = append((*j)[0:0], s...)
    	return nil
    }
    func (m JSON) MarshalJSON() ([]byte, error) {
    	if m == nil {
    		return []byte("null"), nil
    	}
    	return m, nil
    }
    func (m *JSON) UnmarshalJSON(data []byte) error {
    	if m == nil {
    		return errors.New("null point exception")
    	}
    	*m = append((*m)[0:0], data...)
    	return nil
    }
    func (j JSON) IsNull() bool {
    	return len(j) == 0 || string(j) == "null"
    }
    func (j JSON) Equals(j1 JSON) bool {
    	return bytes.Equal([]byte(j), []byte(j1))
    }
    
  • 2、在配置生成实体类的工具中遇到json的话直接转换为JSON数据类型

    dataMap := map[string]func(detailType gorm.ColumnType) (dataType string){
    	"json":      func(detailType gorm.ColumnType) (dataType string) { return "JSON" },      // 自定义	
    }
    
  • 3、逆向生成的实体类

    type ReportEntity struct {
    	ID         int64          `gorm:"column:id;type:int;primaryKey;autoIncrement:true;comment:主键id" json:"id"` // 主键id
    	QueryParam JSON           `gorm:"column:query_param;type:json;not null" json:"queryParam"`
    	Name       string         `gorm:"column:name;type:varchar(50)" json:"name"`
    	CreatedAt  LocalTime      `gorm:"column:created_at;comment:创建时间" json:"createdAt"`            // 创建时间
    	UpdatedAt  LocalTime      `gorm:"column:updated_at;comment:更新时间" json:"updatedAt"`            // 更新时间
    	DeletedAt  gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp(6);comment:软删除时间" json:"-"` // 软删除时间
    }
    
  • 4、定义DTO的时候直接定义JSON数据类型

    type Test1Dto struct {
    	QueryParam JSON `json:"queryParam"`
    	Name       string         `json:"name"`
    }
    
  • 5、随便插入数据

    在这里插入图片描述

三、定义JSON的方式二

  • 1、直接使用gorm自带的json数据类型datatypes.JSON
  • 2、可以自己再次封装下

四、查询语句

  • 1、官方案例地址

  • 2、查询对象中的数据

    first, _ := dao.ReportEntity.WithContext(ctx).
    		Where(gen.Cond(datatypes.JSONQuery("query_param").Extract("gender").Equals("男"))...).First()
    
    SELECT * FROM `report` WHERE JSON_EXTRACT(`query_param`,'$.gender') AND `report`.`deleted_at` IS NULL ORDER BY `report`.`id` LIMIT 1
    

    在这里插入图片描述

  • 3、查询数组中是否包括元素

    first, _ := dao.ReportEntity.WithContext(ctx).Where(gen.Cond(datatypes.JSONArrayQuery("query_param").Contains("1"))...).First()
    
     SELECT * FROM `report` WHERE JSON_CONTAINS (`query_param`, JSON_ARRAY('1')) AND `report`.`deleted_at` IS NULL ORDER BY `report`.`id` LIMIT 1
    

    在这里插入图片描述

  • 4、查询对象数组中是否包括一个值(官网上没找到合适的方式,只能写原生sql)

    SELECT * from report WHERE query_param->"$[1].age" = 20;
    
    first := model.ReportEntity{}
    w.db.Raw(`SELECT * from report WHERE query_param->"$[1].age" = 20;`).Scan(&first)
    

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/90726.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTTPS协议加密原理

目录 一、什么是HTTPS 二、什么是加密/解密 三、为什么要加密 四、常见的加密方式 1.对称加密 2. 非对称加密 五、HTTPS加密方式探讨 1.只使用对称加密 2.只使用非对称加密 3.非对称加密对称加密 4.非对称加密对称加密CA认证 六、总结 一、什么是HTTPS HTTP 协议&a…

vue3+element下拉多选框组件

<!-- 下拉多选 --> <template><div class"select-checked"><el-select v-model"selected" :class"{ all: optionsAll, hidden: selectedOptions.data.length < 2 }" multipleplaceholder"请选择" :popper-app…

git及GitHub的使用

文章目录 git在本地仓库的使用github使用创建仓库https协议连接(不推荐&#xff0c;现在用起来比较麻烦)ssh连接&#xff08;推荐&#xff09;git分支操作冲突处理忽略文件 git在本地仓库的使用 1.在目标目录下右键打开git bash here 2.创建用户名和邮箱(注&#xff1a; 下载完…

ms-tpm-20-ref 在linux下编译

1、代码地址&#xff0c; GitHub - microsoft/ms-tpm-20-ref: Reference implementation of the TCG Trusted Platform Module 2.0 specification.Reference implementation of the TCG Trusted Platform Module 2.0 specification. - GitHub - microsoft/ms-tpm-20-ref: Refe…

Nodejs-nrm:快速切换npm源 / npm官方源和其他自定义源之间切换

一、理解 Nodejs nrm Nodejs nrm 是一个管理 npm 源的工具。由于 npm 在国内的速度较慢&#xff0c;很多开发者会使用淘宝的 npm 镜像源&#xff0c;但是也会遇到一些问题&#xff0c;例如某些包在淘宝镜像源中不存在&#xff0c;或者淘宝镜像源本身也会有问题。 Nodejs nrm …

CSS scoped 属性的原理

scoped 一、scoped 是什么&#xff1f;二、实现原理 一、scoped 是什么&#xff1f; 在 Vue 组件中&#xff0c;为了使样式私有化&#xff08;模块化&#xff09;&#xff0c;不对全局造成污染&#xff0c;可以在 style 标签上添加 scoped 属性以表示它的只属于当下的模块&am…

【MOS管的作用和工作原理】

数电/模电知识学习与分享001 MOS管的作用和工作原理1、MOS管基本概念2、MOS管基本原理3、MOS管广泛作用4、MOS管特点4、参考文献 MOS管的作用和工作原理 1、MOS管基本概念 MOS管&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor&#xff09;是一种常用的半导体…

Unity 之利用 localEulerAngle与EulerAngle 控制物体旋转

文章目录 概念讲解localEulerAngle与EulerAngle的区别 概念讲解 欧拉角&#xff08;Euler Angles&#xff09;是一种常用于描述物体在三维空间中旋转的方法。它使用三个角度来表示旋转&#xff0c;分别绕物体的三个坐标轴&#xff08;通常是X、Y和Z轴&#xff09;进行旋转。这…

AI Agent在情景猜谜场景下的AgentBench基准测试

目录 AgentBench评估哪些场景? 近日,来自清华大学、俄亥俄州立大学和加州大学伯克利分校的研究者设计了一个测试工具——AgentBench,用于评估LLM在多维度开放式生成环境中的推理能力和决策能力。研究者对25个LLM进行了全面评估,包括基于API的商业模型和开源模型。 他们发现…

安卓移动应用开发实训室建设方案

一 、系统概述 安卓移动应用开发作为新一代信息技术的重点和促进信息消费的核心产业&#xff0c;已成为我国转变信息服务业的发展新热点&#xff1a;成为信息通信领域发展最快、市场潜力最大的业务领域。互联网尤其是移动互联网&#xff0c;以其巨大的信息交换能力和快速渗透能…

es的索引管理

概念 &#xff08;1&#xff09;集群&#xff08;Cluster&#xff09;&#xff1a; ES可以作为一个独立的单个搜索服务器。不过&#xff0c;为了处理大型数据集&#xff0c;实现容错和高可用性&#xff0c;ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。 &…

docker项目实战

目录 1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 1&#xff09;拉取mysql:5.6和owncloud镜像 2&#xff09;后台运行容器 3&#xff09;通过ip:端口的方式访问owncloud 2、安装搭建私有仓库 Harbor 1&#xff09;首先准备所需包 2&#xff09;安装h…

JavaScript——为什么静态方法不能调用非静态方法

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

RabbitMQ---订阅模型-Fanout

1、 订阅模型-Fanout Fanout&#xff0c;也称为广播。 流程图&#xff1a; 在广播模式下&#xff0c;消息发送流程是这样的&#xff1a; 1&#xff09; 可以有多个消费者 2&#xff09; 每个消费者有自己的queue&#xff08;队列&#xff09; 3&#xff09; 每个队列都要绑定…

C++:命名空间,缺省参数,函数重载,引用,内联函数

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》 文章目录 前言一、命名空间命名空间的定义命名空间的使用 二、缺省参数缺省参数概念缺省参数分类 三、函数重载函数重载的概念 四、引用引用的概念引用特性引用的使用场景引用与指针的区别 …

vr内容编辑软件降低了虚拟现实项目开发门槛

VR虚拟场景编辑器是一种专门用于创建、修改和设计虚拟场景的工具。它利用vr虚拟现实技术&#xff0c;让用户可以在三维空间中直接对场景进行操作和编辑。这种编辑器的出现&#xff0c;使得用户可以更加直观、自由地进行场景设计和制作&#xff0c;为诸多领域带来了新的可能性。…

目标检测(Object Detection):Fast R-CNN,YOLO v3

目录 目标检测(Object Detection) R-CNN SPPNet Fast R-CNN YOLO v1 YOLO v2 YOLO v3 目标检测(Object Detection) 任务是计算机视觉中非常重要的基础问题&#xff0c;也是解决图像分割、目标跟踪、图像描述等问题的基础。目标检测是检测输入图像是否存在给定类别的物体…

将公共组件提取到npm包中

多个前端项目中公共组件使用方案&#xff08;npm包方式&#xff09; - 简书

深入篇【C++】set和map(multiset/multimap)特性总结与使用

深入篇【C】set和map(multiset/multimap&#xff09;特性总结与使用 一.set/multiset总结二.map/multiset总结三.set/map应用 一.set/multiset总结 set是按照一定次序存储元素的容器在set中&#xff0c;元素的value也标识它(value就是key&#xff0c;类型为T)&#xff0c;并且每…

服务器数据恢复-EVA存储磁盘故障导致存储崩溃的数据恢复案例

EVA系列存储是一款以虚拟化存储为实现目的的中高端存储设备。EVA存储中的数据在EVA存储设备工作过程中会不断进行迁移&#xff0c;如果运行的任务比较复杂&#xff0c;EVA存储磁盘负载加重&#xff0c;很容易出现故障的。EVA存储通过大量磁盘的冗余空间和故障后rss冗余磁盘动态…