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

news2024/11/19 7:45:56

一、说明

  • 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)
    

    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot多环境指定yml或者properties

Spring Boot多环境指定yml或者properties 文章目录 Spring Boot多环境指定yml或者properties加载顺序配置指定某个yml 加载顺序 ● application-local.properties ● application.properties ● application-local.yml ● application.yml application.propertes server.port…

2023前端面试笔记 —— CSS3

系列文章目录 内容链接2023前端面试笔记HTML52023前端面试笔记CSS3 文章目录 系列文章目录前言一、CSS选择器的优先级二、通过 CSS 的哪些方式可以实现隐藏页面上的元素三、px、em、rem之间有什么区别?四、让元素水平居中的方法有哪些五、在 CSS 中有哪些定位方式六…

什么是遗传算法(Genetic Algorithm,简称 GA)?

目录 一、遗传算法介绍二、遗传算法应用场景三、遗传算法具体案列1、求解旅行商问题(TSP 问题)2、求解一个矩阵中的最大值3、基于遗传算法的图像压缩方法 四、遗传算法重要意义五、生物进化与遗传算法之间的关系 一、遗传算法介绍 遗传算法(…

Sketch 98 中文版-mac矢量绘图设计

Sketch是一款专为Mac操作系统设计的矢量图形编辑软件,被广泛应用于UI/UX设计、网页设计、移动应用设计等领域。Sketch提供了各种工具和功能,包括绘图、图形设计、排版等,可以帮助设计师轻松地创建高质量的矢量图形和模型。Sketch的主要特点包…

自动气象站丨自动观测和记录气象信息

所谓自动气象站,是指无需人工就能自动检测多种气象要素,并将数据实时发送给观测中心的气设备。它是填补小区域气象探测数据空白的重要手段。自动气象站主要由传感器、数据采集器、太阳能供电系统、立杆组成,可以监测风速、风向、降雨量、空气…

[MyBatis系列①]增删改查

目录 1、基础回顾 2、例子引入 3、映射文件 4、增删改查 4.1、add 4.2、delete 4.3、update 4.4、check 5、核心配置文件 5.1、properties 5.2、typeAliases 5.2.1、自定义 5.2.2、⭐MyBatis自带 5.3、environments 5.3.1、environment 5.3.2、transactionMana…

DataWhale 机器学习夏令营第三期——任务二:可视化分析

DataWhale 机器学习夏令营第三期 学习记录二 (2023.08.23)——可视化分析1.赛题理解2. 数据可视化分析2.1 用户维度特征分布分析2.2 时间特征分布分析 DataWhale 机器学习夏令营第三期 ——用户新增预测挑战赛 学习记录二 (2023.08.23)——可视化分析 2023.08.17 已跑通baseli…

论文解读:Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions

发布时间:2022.4.4 (2021发布,进过多次修订) 论文地址:https://arxiv.org/pdf/2112.08088.pdf 项目地址:https://github.com/wenyyu/Image-Adaptive-YOLO 虽然基于深度学习的目标检测方法在传统数据集上取得了很好的结果&#xf…

【C++数据结构】二叉搜索树

【C数据结构】二叉搜索树 目录 【C数据结构】二叉搜索树二叉搜索树概念二叉搜索树操作二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除二叉搜索树的实现二叉搜索树的应用二叉搜索树的性能分析 作者:爱写代码的刚子 时间:2023.8.22 前言:二…

MySQL数据库管理操作

MySQL常用的数据类型 int:整型 用于定义整数类型的数据float:单精度浮点4字节32位准确表示到小数点后六位double:双精度浮点8字节64位char:固定长度的字符类型用于定义字符类型数据。Char如果存入数据的实际长度比指定长度要…

前端工程化概述

软件工程定义:将工程方法系统化地应用到软件开发中 前端发展历史 前端工程化的发展历史可以追溯到互联网的早期阶段,随着前端技术的不断演进和互联网应用的复杂化,前端工程化也逐渐成为了前端开发的重要领域。以下是前端工程化的主要发展里程…

诚迈科技子公司智达诚远与Unity中国达成合作,打造智能座舱新时代

2023 年 8 月 23 日,全球领先的实时 3D 引擎 Unity 在华合资公司 Unity 中国举办发布会,正式对外发布 Unity 引擎中国版——团结引擎,并带来专为次世代汽车智能座舱打造的团结引擎车机版。发布会上,诚迈科技副总裁、诚迈科技子公司…

C 实现Window/DOS 键盘监听事件

今天是重新复习C语言实现的第一天,今天想编写C 对Windwos/Dos 键盘事件的学习。但是我在安装Visual Studio 2022 没有安装MFC 框架,今天记录下VS追加 MFC框架。 Visual Studio 2022 追加MFC 1、打开vs,点击创建新项目,右侧滑动框…

【ubuntu】 20.04 网络连接器图标不显示、有线未托管、设置界面中没有“网络”选项等问题解决方案

问题 在工作中 Ubuntu 20.04 桌面版因挂机或不当操作,意外导致如下问题 1、 Ubuntu 网络连接图标消失 2、 有线未托管 上图中展示的是 有线 已连接 ,故障的显示 有限 未托管 或其他字符 3、 ”设置“ 中缺少”网络“选项 上图是设置界面&#xff0c…

Excel 分组排名

分组排名 公式&#xff1a;SUMPRODUCT((A:AA2)*(C:C>C2)) 1 降序&#xff1a;> 改为 < ⚠️注意1&#xff1a;此处空值参与排名&#xff1b;不参与排名则公式改为&#xff1a;IF(C2“”,“”,SUMPRODUCT((A:AA2)*(C:C>C2)) 1) ⚠️注意2&#xff1a;相同值的项…

多维时序 | MATLAB实现BiTCN-BiGRU-Attention多变量时间序列预测

多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现BiTCN-BiGRU-Attention多变量时间序列预测。 模型描…

大数据数据仓库

一.在线教育 1.数据采集 1.数仓概念 数据仓库是为企业制定决策&#xff0c;提供数据支持的。数据采集和存储、对数据进行计算和分析 2.项目架构 2.数据分类 业务数据 用户行为数据 爬虫数据 2.离线数仓 3.实时数仓

.NET 8 Preview 7 中的 ASP.NET Core 更新

作者&#xff1a;Daniel Roth 排版&#xff1a;Alan Wang .NET 8 Preview 7 现在已经发布&#xff0c;其中包括了对 ASP.NET Core 的许多重要更新。 以下是预览版本中新增功能的摘要&#xff1a; 服务器和中间件 防伪中间件 API 编写 最小 API 的防伪集成 Native AOT 请求委托…

【Modbus通信实验三】数据切片问题

在做两个串口相互通信的实验中&#xff0c;当发送频率快一点时偶尔会遇到以下情景&#xff0c;即一次send中把原数据拆成两份发送&#xff0c;就会导致CRC校验错误。下图中6字节数据拆成42是把SetRThreshold()阈值设为2&#xff0c;当设为1的情况下则会拆成51。 一开始以为是缓…

一款轻量级开发者工具,提高开发效率

Devkits Devkits 是一款轻量级桌面端应用&#xff0c;提供了一系列开发者工具&#xff0c;提高开发效率。 离线。类似的在线工具已经不少了&#xff0c;但是大多数都是在线的&#xff0c;网络不好的时候就很难用了。Devkits 提供了离线使用的功能&#xff0c;可以在没有网络的…