Gorm -- 查询记录
文章目录
- 查询单条记录
- 通过结构体查询对应表
- 指定表并将查询一条记录结果放至字典中
- 按照主键查询
- 查询多行记录
- 按照主键查询
- 使用结构体查询
- 指定表名查询并放至字典列表中
- 指定查询字段
- 查询条件
- Where 条件(=、like、in)
- 通过结构体或字典设置查询条件
- 或
- 非
- 排序
- Limit&Offset
- 汇总筛选
- 去重
- 联合查询
(。・∀・)ノ゙嗨
User结构体定义、数据库表设计以及Gorm初始化请参考文章 https://mingvvv.blog.csdn.net/article/details/129026914
首先初始化连接池
db := cus_orm.MysqlConnection()
查询单条记录
通过结构体查询对应表
user := &model.User{}
db.Debug().Take(user) //按照数据库表默认排序
db.Debug().First(user) //按照主键正序 如果没有设置主键 则按照第一个字段排序
db.Debug().Last(user) //按照主键倒序 如果没有设置主键 则按照第一个字段排序
-----------------------------
SELECT * FROM `user` LIMIT 1
SELECT * FROM `user` WHERE `user`.`id` = 521 ORDER BY `user`.`id` LIMIT 1
SELECT * FROM `user` WHERE `user`.`id` = 521 ORDER BY `user`.`id` DESC LIMIT 1
查询后实际上会返回一个 DB 指针类型的结果,DB结构体的内容如下:
type DB struct {*ConfigError errorRowsAffected int64Statement *Statementclone int
}
通过接受这个结果,我们可以提前判断查询是否出现异常,并获取到受影响的行数:
result := db.First(&user)
//判断是不是没有找到任何一条行信息
if errors.Is(result.Error, gorm.ErrRecordNotFound) {fmt.Println("记录不存在")
}else{fmt.Println(result.RowsAffected)
}
指定表并将查询一条记录结果放至字典中
data2 := map[string]interface{}{}
result := db.Debug().Table("user").Take(&data2)
------------------------------------------
SELECT * FROM `user` LIMIT 1
这样我们就可以随意查询表中的数据,但是要注意的是,指定表名是不能使用 First() 和 Last() 函数,
因为使用这两个方法生成的SQL语句中会自动加入按照模型主键排序的逻辑,又因为上述代码中并没有使用到模型,因此最后的SQL会报错
如下:
db.Debug().Table("user").First(&data2)
----------------------------
SELECT * FROM `user` ORDER BY id,`user`. LIMIT 1
按照主键查询
db.Debug().First(user, 531) //查询主键是 531 的记录
db.Debug().First(user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a") //主键是string时,需要用这种格式
---------------------------------------------------------
SELECT * FROM `user` WHERE `user`.`id` = 531 ORDER BY `user`.`id` LIMIT 1
SELECT * FROM `user` WHERE id = '1b74413f-f3b8-409f-ac47-e8c062e3472a' ORDER BY `user`.`id` LIMIT 1
查询多行记录
按照主键查询
db.Debug().Find(user, []int{531, 532, 533})
---------------------------------------------------------
SELECT * FROM `user` WHERE `user`.`id` IN (531,532,533)
使用结构体查询
var users []model.User
db.Debug().Find(&users)
------------------------------
SELECT * FROM `user`
指定表名查询并放至字典列表中
var users []map[string]interface{}
db.Debug().Table("user").Find(&users)
//Scan一定要自己指定表名
db.Debug().Table("user").Scan(&users)
--------------------------------------------
SELECT * FROM `user`
SELECT * FROM `user`
指定查询字段
db.Debug().Select("concat(name,age)", "age").Find(&users)
---------------------------------------
SELECT concat(name,age),`age` FROM `user`
查询条件
Where 条件(=、like、in)
db.Debug().Where("age = ?", 18).Find(&users)
db.Debug().Where("age = ? and name like ?", 18, "%测试%").Find(&users)
db.Debug().Where("name in ?", []string{"测试goper333", "测试goper222"}).Find(&users)
--------------------------------------------
SELECT * FROM `user` WHERE age = 18
SELECT * FROM `user` WHERE age = 18 and name like '%测试%'
SELECT * FROM `user` WHERE name in ('测试goper333','测试goper222')
Gorm支持在First、Last、FInd方法中添加内嵌查询条件
// Inline 查询条件
db.Debug().Find(&users, "age = ? and name in ?", 18, []string{"测试goper333", "测试goper222"})
---------------------------------------------
SELECT * FROM `user` WHERE age = 18 and name in ('测试goper333','测试goper222')
通过结构体或字典设置查询条件
db.Debug().Where(&model.User{Name: "姓名"}).Find(&users)
db.Debug().Where(map[string]interface{}{"Name": "姓名"}).Find(&users)
db.Debug().Where([]int{521, 533}).Find(&users) //默认主键的 in 查询
------------------------------------------
SELECT * FROM `user` WHERE `user`.`name` = '姓名'
SELECT * FROM `user` WHERE `Name` = '姓名'
SELECT * FROM `user` WHERE `user`.`id` IN (521,533)
当使用结构体去设置查询条件的时候我们要注意一点:
零值(0、false、字符串"")不参与SQL组建
即如果我设置了 Age = 0 那个在最后生成的SQL中不会出现 age = 0 这样一行条件 ,如下:
userQ := &model.User{Name: "姓名", Age: 0}
db.Debug().Where(&userQ).Find(&users)
-----------------------------------
SELECT * FROM `user` WHERE `user`.`name` = '姓名'
如果想要让零值参与SQL查询,我们就要使用字典形式去组建SQL,或者使用Raw方法自己写完整SQL。
var users []model.User
db.Debug().Where(map[string]interface{}{"Name": "姓名", "Age": 0}).Find(&users)
db.Debug().Raw("select * from user where name = ? and age = ?", "姓名", 0).Find(&users)
------------------------------------
SELECT * FROM `user` WHERE `Age` = 0 AND `Name` = '姓名'
select * from user where name = '姓名' and age = 0
或
db.Debug().Where("name = '测试'").Or(&model.User{Name: "goper222", Age: 18}).Or(map[string]interface{}{"id": "526"}).Find(&users)
------------------------------
SELECT * FROM `user` WHERE name = '测试' OR (`user`.`name` = 'goper222' AND `user`.`age` = 18) OR `id` = '526'
非
db.Debug().Not("name = ?", "姓名").Find(&users)
db.Debug().Not(model.User{Name: "姓名", Age: 18}).Find(&users) //使用结构体
db.Debug().Not(map[string]interface{}{"Name": "姓名", "Age": 0}).Find(&users) // 使用字典
db.Debug().Not([]int{521, 533}).Find(&users) //主键非 条件查询
--------------------------------------------
SELECT * FROM `user` WHERE NOT name = '姓名'
SELECT * FROM `user` WHERE (`user`.`name` <> '姓名' AND `user`.`age` <> 18)
SELECT * FROM `user` WHERE (`Age` <> 0 AND `Name` <> '姓名')
SELECT * FROM `user` WHERE `user`.`id` NOT IN (521,533)
排序
db.Debug().Order("age desc,name").Find(&users)
db.Debug().Order("age desc").Order("name").Find(&users)
------------------------------------------------
SELECT * FROM `user` ORDER BY age desc,name
Limit&Offset
db.Debug().Limit(5).Find(&users)
db.Debug().Offset(10).Limit(5).Find(&users)
-------------------------------
SELECT * FROM `user` LIMIT 5
SELECT * FROM `user` LIMIT 5 OFFSET 10
汇总筛选
db.Debug().Select("name").Group("name").Find(&users)
db.Debug().Select("name").Group("name,age").Having("age = 18").Find(&users)
------------------------------------------------
SELECT `name` FROM `user` GROUP BY `name`
SELECT `name` FROM `user` GROUP BY name,age HAVING age = 18
去重
db.Debug().Distinct("name").Find(&users)
------------------------------------------------
SELECT DISTINCT `name` FROM `user`
联合查询
db.Debug().Select("a.*").Joins("a left join user_extend b on a.id = b.user_id").Find(&users)
------------------------------------------------
SELECT a.* FROM `user` a left join user_extend b on a.id = b.user_id
相关文章:
Gorm -- 查询记录
文章目录查询单条记录通过结构体查询对应表指定表并将查询一条记录结果放至字典中按照主键查询查询多行记录按照主键查询使用结构体查询指定表名查询并放至字典列表中指定查询字段查询条件Where 条件(、like、in)通过结构体或字典设置查询条件或非排序Li…...
「Python 基础」错误、调试与测试
文章目录1. 错误处理2. debugassertloggingpdbIDE3. unittest编写运行setUp 与 tearDown4. doctest1. 错误处理 try:# 可能有异常的代码块r 10/int(2) except ValueError as e:# 有异常时执行,捕获指定类型及其子类型的错误print(ValueError, e) except ZeroDivis…...
17万字 JUC 看这一篇就够了(一) (精华)
JUC 今天我们来进入到 Java并发编程 JUC 框架的学习 ,内容比较多,但希望我们都能静下心来,耐心的看完这篇文章 文章目录JUC进程概述对比线程创建线程ThreadRunnableCallable线程方法APIrun startsleep yieldjoininterrupt打断线程打断 park终…...
C++右值引用/移动语义
在此之前,我们所用的引用,其实都是左值引用。 int a 10; int& ra a; 下面我们来重新认识一下引用: 而何为左值?左值引用其实是什么?请往下看~ 左值是一个表示数据的表达式(如变量名或解引用的指针)ÿ…...
小樽C++ 多章⑧ (叁) 指针与字符串、(肆) 函数与指针
目录 叁、函数与字符串 肆、函数与指针 4.1 指针作为函数参数 4.2 函数返回指针 4.3 函数指针与函数指针数组 4.4 结构体指针 小樽C 多章⑧ (壹) 指针变量https://blog.csdn.net/weixin_44775255/article/details/129031168 小樽C 多章⑧ …...
Mybatis-Plus
新建个项目 引入lombok devtools web mysql驱动 pom.xml引入mybatis-plus依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency> sp…...
yolov8行人识别教程(2023年毕业设计+源码)
yolov8识别视频直接上YOLOv8的结构图吧,小伙伴们可以直接和YOLOv5进行对比,看看能找到或者猜到有什么不同的地方? Backbone:使用的依旧是CSP的思想,不过YOLOv5中的C3模块被替换成了C2f模块,实现了进一步的轻…...
CAD指令框找不到了怎么调出来?CAD指令框调出方法
CAD制图过程中,为了提高设计师的绘图效率,经常会用到各种CAD命令快捷键,可是CAD指令框突然不见了,这就让人很头疼了。CAD指令框找不到了怎么调出来呢?本节内容小编以浩辰CAD软件为例来给大家分享一下CAD指令框调出方法…...
一般用哪些工具做大数据可视化分析?
做数据分析这些年来,从刚开始的死磕excel,到现在成为数据分析行业的偷懒大户,使用过的工具还真不少! 这篇分享一些我在可视化工具上的使用心得,由简单到复杂,按照可视化类型一共分为纯统计图表类、GIS地图…...
Python每日一练(20230308)
目录 1. Excel表列名称 ★ 2. 同构字符串 ★★ 3. 分割回文串 II ★★★ 🌟 每日一练刷题专栏 C/C 每日一练 专栏 Python 每日一练 专栏 1. Excel表列名称 给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。 例如࿱…...
jvm之堆解读
堆(Heap)的核心概述 堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的。 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区…...
重构·改善既有代码的设计.02
前言之前在《重构改善既有代码的设计.01》中初步了解了重构的基本前提,基础原则等入门知识。今天我们继续第二更......识别代码的坏味道Duplicated Code 重复代码。最单纯的Duplicated Code就是“同一个类中含有相同的表达式”或“两个互为兄弟的子类内含有相同表达…...
脑电信号处理总成
目录一. EEG(脑电图)1.1 脑波1.2 伪迹1.2.1 眼动伪迹1.2.2 肌电伪迹1.2.3 运动伪迹1.2.4 心电伪迹1.2.5 血管波伪迹1.2.6 50Hz和静电干扰1.3 伪迹去除方法1.3.1 避免伪迹产生法1.3.2 直接移除法1.3.3 伪迹消除法一. EEG(脑电图) 1.1 脑波 脑波(英语:br…...
判断推理之图形推理
考点一动态位置变化(一)平移1.特征:图形在平面上的移动,图形本身的大小和形状不发生改变。2.方向:直线(上下、左右、斜对角线),绕圈(顺时针、逆时针)3.距离&a…...
【预告】ORACLE Unifier v22.12 虚拟机发布
引言 离ORACLE Primavera Unifier 最新系统 v22.12已过去了3个多月,应盆友需要,也为方便大家体验,我近日将构建最新的Unifier的虚拟环境,届时将分享给大家,最终可通过VMWare vsphere (esxi) / workstation 或Oracle …...
Sql执行流程与Redo log、 Undo log、 Bin log日志文件
文章目录Sql执行流程与日志文件Sql的执行流程Redo LogBin logUndo logSql执行流程与日志文件 Sql的执行流程 mysql的内部组件结构如下图所示 连接器 与客户端建立连接,检验登录密码,分配相应权限 查询缓存 执行sql语句时会先从这里找一下,…...
如何提高软件测试执行力
高效的测试执行力 不管在哪个行业,高校的执行力都是不可或缺的。在软件测试行业更是这样。有些测试人员,很勤奋也很吃苦,但是可能最终不能很好的完成测试任务。究其原因就是一个测试执行力的问题。 高效执行就是有目标,有计划&…...
Open3D 计算点到平面的距离
目录 一、算法原理二、代码实现三、结果展示一、算法原理 平面外一点 ( x 1 , y 1 , z 1 ) (x_1,y_1,z_1) (x...
DDD领域驱动设计初探
DDD 强调领域模型要兼顾业务和技术两个视角。 我们怎么用一套系统化的方法,抽丝剥茧、一步一步地把需求落实到代码呢?咱们看看下面这张图,它表示了领域驱动设计中的主要流程。 领域驱动设计主要的开发流程你可以看到,在整个开发流…...
C中AES_cbc_encrypt加密对应java中的解密
前言知识: 1.AES(Advanced Encryption Standard)高级加密标准,作为分组密码(把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文)。 2.在AES标准…...
实战对比:Vamana/HNSW/NSG三大图算法在百维向量搜索中的性能差异
百维向量搜索实战:Vamana/HNSW/NSG三大图算法性能横评 在当今数据爆炸的时代,高效处理高维向量搜索已成为推荐系统、图像识别和自然语言处理等领域的核心技术瓶颈。面对百维甚至更高维度的向量数据,传统暴力搜索方法早已力不从心,…...
YOLO训练结果results.csv全字段解读:从epoch到lr/pg2,每个数字背后的调参玄机
YOLO训练结果results.csv全字段解读:从epoch到lr/pg2,每个数字背后的调参玄机 当你盯着YOLO训练结束后生成的results.csv文件,是否曾感到困惑——这些密密麻麻的数字究竟在诉说什么故事?作为模型训练的"黑匣子记录仪"&a…...
3步实现PDF文献自动化管理:Zotero Reference插件新手入门指南
3步实现PDF文献自动化管理:Zotero Reference插件新手入门指南 【免费下载链接】zotero-reference PDF references add-on for Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-reference 一、价值定位:为什么选择Zotero Reference …...
yolo系列演进分析
YOLO(You Only Look Once)作为计算机视觉领域最具影响力的目标检测算法系列之一,自2016年首次提出以来经历了持续的技术革新与架构演进。从最初的YOLOv1到2026年最新发布的YOLO26,这一系列不仅实现了从"单阶段检测"到"端到端推理"的范式转变,更在速度…...
EVA-02在社交媒体分析中的应用:舆情摘要与情感倾向判断
EVA-02在社交媒体分析中的应用:舆情摘要与情感倾向判断 最近跟一个做品牌营销的朋友聊天,他正为每天要处理海量的社交媒体评论发愁。团队几个人盯着屏幕,手动翻看、记录、总结,不仅效率低,还容易漏掉关键信息。他问我…...
SCN随机配置网络模型在多特征分类预测中的应用
SCN随机配置网络模型SCN分类预测,SCN分类预测,多特征 输入模型。 多特征输入单输出的二分类及多分类模型。 程序内注释详细,直接替换数据就可以用。 程序语言为matlab,程序可出分类效果图,迭代优化图,混淆矩…...
TinyGPSPlusPlus:嵌入式NMEA解析库深度指南
1. TinyGPSPlusPlus:面向嵌入式系统的可定制化NMEA解析库深度解析1.1 库定位与工程价值TinyGPSPlusPlus 是一款专为资源受限嵌入式平台(尤其是Arduino生态)设计的轻量级、高可定制化的NMEA协议解析库。其核心工程价值在于:在极小内…...
JavaScript代码保护实战:用javascript-obfuscator给你的前端穿上防弹衣
JavaScript代码保护实战:用javascript-obfuscator打造坚不可摧的前端防线 1. 为什么前端代码需要保护? 记得去年参与一个电商项目时,团队花三个月开发的核心促销算法,上线一周就被竞争对手完整"借鉴"。检查发现对方直…...
https://docker.m.daocloud.io/v2 访问失败
目录 2. 测试 mirror 能不能访问(很关键) 正常: 修改docker-compose ① 改 compose ② 拉镜像 ③ 启动 2. 测试 mirror 能不能访问(很关键) 比如: curl -I https://docker.m.daocloud.io/v2/ 正常&…...
【deepseek】SYCL™ 2020 Specification 简介
SYCL™ 2020 Specification 简介 SYCL 2020 是由 Khronos Group 发布的异构计算标准,它是 SYCL(发音为 “sickle”)规范的最新主要版本。SYCL 是一种基于标准 C 的编程模型,旨在简化在各种硬件加速器(如 CPU、GPU、FPG…...
