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标准…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
