gorm 连接查询(两表联查,三表联查)预加载的坑

Gin之GORM多表关联查询(多对多;自定义预加载SQL) 对于many2manygorm.Model"`gorm.Model// 连接表:user_languages若要重写它们,可以使用标签foreignKeyreferences。当然,您不需要使用全部的标签,你可以仅使用其中的一个重写部分的外键、引用。gorm.Modelgorm.Model// 会创建连接表:user_profiles。 阅读详情

@ GO gorm 连接查询

gorm 关接查询(两表联查,三表联查)

新人一枚,代码不够漂亮,望多多担待

多少雄心壮志跃跃欲试,宝剑尚未佩妥,出门已是江湖

1,gorm模型如下:

// 文章
type Topics struct {
	Id         int        `gorm:"primary_key"`
	Title      string     `gorm:"not null"`
	UserId     int        `gorm:"not null"`
	CategoryId int        `gorm:"not null"`
	Category   Categories `gorm:"foreignkey:CategoryId"`//文章所属分类外键
	User       Users      `gorm:"foreignkey:UserId"`//文章所属用户外键
}

// 用户
type Users struct {
	Id   int    `gorm:"primary_key"`
	Name string `gorm:"not null"`
}

// 分类
type Categories struct {
	Id   int    `gorm:"primary_key"`
	Name string `gorm:"not null"`
}
gorm官方文档对foreign key 有这么一句话:To define a belongs to relationship, the foreign key must exists, default foreign key uses owner’s type name plus its primary key(要定义属于关系,外键必须存在,默认外键使用所有者的类型名及其主键)也就是说默认外键满足其所有者的类型名和主键

2, 查询代码

func GetDB() *gorm.DB {
	//“mysql”, “mysql用户名:密码@tcp(ip地址:端口号)/samples?charset=utf8&parseTime=True&loc=Local”)
	db, err := gorm.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		fmt.Println("db error:", err)
	} else {
		fmt.Println("database connection success")
	}
	defer db.Close()
	return db
}

func main() {
	to := Topics{}
	to.Id = 1
	to.TopicByID(1)
}

func (Topics) TopicByID(id int) (*Topics, error) {
	db := GetDB()
	var topic Topics

	//db.Where("id=?", id).First(&topic)
	// 关联的关键代码
	//db.Model(&topic).Related(&topic.Category, "CategoryId")
	//result := db.Model(&topic).Related(&topic.User, "UserId")

	result := db.First(&topic)
	//result := db.Where("id=?", id).Preload("Category").Preload("User").First(&topic)
	fmt.Println("result:", result)
	if err := result.Error; err != nil {
		fmt.Println(err)
		return &topic, err
	}
	//result := db.where("id=?",id)
	if result.RecordNotFound() == true {
		return &topic, errors.New("文章不存在!")
	}
	fmt.Println("result:", result)

	return &topic, nil
}
Preload 预加载)gorm官方文档为:
db.Preload("Orders").Find(&users)
//// SELECT * FROM users;
//// SELECT * FROM orders WHERE user_id IN (1,2,3,4);

db.Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
//// SELECT * FROM users;
//// SELECT * FROM orders WHERE user_id IN (1,2,3,4) AND state NOT IN ('cancelled');

db.Where("state = ?", "active").Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
//// SELECT * FROM users WHERE state = 'active';
//// SELECT * FROM orders WHERE user_id IN (1,2) AND state NOT IN ('cancelled');

db.Preload("Orders").Preload("Profile").Preload("Role").Find(&users)
//// SELECT * FROM users;
//// SELECT * FROM orders WHERE user_id IN (1,2,3,4); // has many
//// SELECT * FROM profiles WHERE user_id IN (1,2,3,4); // has one
//// SELECT * FROM roles WHERE id IN (4,5,6); // belongs to
in子查询与inner join连接查询相比,在一定的实际执行执行计划下,他们的io开销和性能是没有优劣的
sql中in和inner join 查询的优劣: https://www.cnblogs.com/kerrycode/p/6868488.html

有任何问题请留言,大家一起讨论,互相学习。

GORM高级特性:Scope、预加载与自定义数据类型的应用 GORM作为Go语言中最流行的ORM框架,其基础CRUD功能已能满足大多数场景需求。Scope作用域:实现可复用的查询逻辑封装,支持多租户数据隔离、软删除等通用策略预加载(Preload):解决关联查询中的N+1问题,显著减少数据库交互次数自定义数据类型:支持JSON、枚举、时间格式等数据库原生类型的Go语言映射,提升数据模型灵活性本文通过原理分析、代码实战和数学建模,全面展示三大特性的应用场景与最佳实践。核心概念:解析三大特性的原理与相互关系算法与实现:通过Go代码演示具体操作步骤数学模型。 阅读详情

相关推荐

TVS 和压敏电阻联合使用进行浪涌保护时,压敏电阻的压敏电压要低于TVS 的钳位电压 VC。

通过先让MOV接管,可以确保在大多数情况下,电压不会迅速上升到TVS二极管的钳位电压,从而保护TVS二极管免受持续高能量冲击的损害。总结来说,将MOV的压敏电压设置得低于TVS二极管的钳位电压,可以提供一种分级的保护机制,优化浪涌保护性能,同时保护敏感的TVS二极管不被过度的能量冲击损坏,并延长其使用寿命。MOV吸收的能量(Wmov):假设浪涌电流为10kA,MOV导通后将电压限制在300V,那么Wmov = Ipp * Vmov = 10kA * 300V = 3MW。例如,Vmov可以设定为275V。

weixin_66642980的博客 2246

【GORM使用】如何在GORM上使用MYSQL的UNION ALL / UNION 语法

如何在GORM上使用MYSQL的UNION ALL / UNION 语法提示:使用GORM的raw()方法。

tr6666的博客 1898

视频编解码——视频编解码器工作原理

目录什么是视频编解码器为什么需要视屏编解码器视频编码器与数字视频容器时评编码器的历史 什么是视频编解码器 简单来说就是用于压缩或解压数字视频的软件或硬件 编码是信息从一种形式或格式转换为另一种形式的过程,解码是编码的反向。 适用于视频 编码是将视频、音频的原始格式的文件通过压缩技术转换成另一种格式(视频如h.264,h.265,m-jpeg等)。 解码是编码的反向过程。应用中,一般是将h.264,h.265格式数据解码成如YUV格式裸流交给显示器显示。 为什么需要视屏编解码器 需要在有限的带宽或存储空间

路人coder 1万+

关于gorm的preload方法笔记说明

gorm的preload预加载笔记假设有以下三张表的结构体常规预加载多级预加载preload的原理 假设有以下三张表的结构体 homePage 主页表结构体 type HomePage struct { global.GVA_MODEL UserId uint `json:"userId" gorm:"column:user_id;comment:'用户id'"` Desc string `json:"desc" form:"desc" gorm:"column:

dorlolo的博客 7905

手把手教你用CANape调试XCP安全会话:DLL权限管理+四种加密模式实战演示

本文详细介绍了如何使用CANape调试XCP安全会话,重点解析了DLL权限管理的实现与配置方法,并通过实战演示了标定页切换、DAQ测量、STIM旁路和PGM刷写四种典型加密模式的操作流程与调试技巧,帮助工程师深入理解并掌握XCP安全访问机制。

smartcontract5的博客 562

手把手教你用STM32驱动SPL06-001气压传感器(附完整代码与避坑指南)

本文详细介绍了如何使用STM32驱动SPL06-001气压传感器,包括硬件连接、寄存器配置、驱动层实现和数据补偿算法。通过完整的代码示例和避坑指南,帮助开发者快速掌握SPL06传感器的应用技巧,提升嵌入式系统开发效率。

weixin_42552315的博客 294

后端入门课 02|SQL & GORM 必知必会

在 GORM 中,操作数据库需要预先定义模型,用来和数据表做映射。比如定义一个 User 结构体,这个结构体就是数据模型。底层使用 Golang 的 database 标准库,利用反射原理,执行读写操作时,将结构体翻译为 SQL 语句,并转换为对应的模型。Go复制代码。

BASK2311的博客 1097

基于DWA算法的机器人动态避障技术实现及matlab代码

DWA算法是一种基于轨迹的运动规划算法,其核心思想是:在机器人当前位置及速度的基础上,结合机器人感知到的环境信息,生成一组合法的速度指令,然后从这组速度指令中选取代价最小的速度指令作为机器人的下一步操作。下面,我们将通过一个实例来演示基于DWA算法的机器人动态避障技术实现。假设机器人在一个宽敞的场地内行驶,但场地内有一些固定障碍物和移动障碍物,机器人需要避开这些障碍物,并在场地内自由移动。本文给出了一种基于DWA算法的机器人动态避障技术实现及相应的matlab代码,读者可以根据自身需求进行修改和调整。

uote_e的博客 1003

[Go实战]go-gorm的预加载 preload或related方法使用场景

特殊说明: gorm官方文档对foreign key 有这么一句话:To define a belongs to relationship, the foreign key must exists, default foreign key uses owner’s type name plus its primary key(要定义属于关系,外键必须存在,默认外键使用所有者的类型名及其主键)也就...

学生董格 2万+

把 ABAP SQL 窗口函数讲透:从 OVER 到 LEAD、RANK 与累计分析

ABAP SQL窗口函数在不丢失明细记录的前提下,为每行数据提供组内统计和排名功能。它通过OVER子句定义计算窗口,支持三类函数:聚合型(AVG/SUM等)、排名型(ROW_NUMBER/RANK等)和取值型(LEAD/LAG)。相比GROUP BY会合并多行数据,窗口函数保留原始记录同时附加计算结果,特别适合需要保留明细又要展示统计信息的业务场景,如销售排名、客户分层分析等。语法核心是OVER子句,通过PARTITION BY分组,ORDER BY排序,可灵活定义计算范围。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1274

《一》:LBE,VR 大空间系列——场景环境需求解析

当前,大量 VR 体验活动在室内场地开展。因此,对于场地照明有特定要求:除天花板外,场地的所有表面均需有照明覆盖。这是为了保证玩家无论处于场地的哪个位置,地面与墙面都不会出现明显的影子。场地内不建议安装射灯或高强度的点光源,若已安装此类灯具,需使用柔光板进行遮盖。此外,要避免在阳光下使用 VR 设备台。参考图(请忽略其中Maker标签)

unitygroup的博客 944

gorm查询嵌套结构体,嵌套预加载preload,关联,外键foreignkey,引用references

gorm还真是难,也是因为它强大。 v2.0太多变化,所以还不敢用。下面是v1.0的。 花了好长时间试验,才得到了自己想要的结果。 一直想用gorm查询到嵌套结构体,可惜自定义嵌套结构体好像不支持?下次按这个思路再试试,可能也行哦。 用join查询虽然强大,但是无法将查询结构映射到嵌套结构体。 下面3个结构体是嵌套关系,3层嵌套(或是2层嵌套) //出差登记信息表 type Business struct { ID uint `json:"id" gorm:"

hotqin888的专栏 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

个人技术总结——Gorm框架的多表联合查询

Gorm框架可以进行多表联合查询,通过多表联合查询可以通过一条sql语句即可完成对数据库多表数据的获取,而不需要执行多条sql语句对数据库进行多次访问,从而加快了数据的处理速度。通俗来说,对于表A和表B,left join返回包括表A中的所有记录和表B中联结字段相等的记录;下面是Gorm框架实现多表查询的具体步骤。关键点在于要利用Joins()函数来选择连接查询的表,并且这里的函数参数要根据刚刚的Model设计中的命名来选择,比如在Comment中我们要查询的是Author字段,就传入“Author”。

m0_51671161的博客 4335

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【最佳实践】gorm 联表查询 joins

使用gorm的一些技巧、经验 常规使用示例 如何在一对一、一对多、多对一的关系下使用gorm进行联表查询

qq_43490312的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

gorm Preload与Joins带条件查询--闭坑指南与示例

1. Preload 1.1 Preload 带条件查询 2 Joins 2.1 Joins 带条件查询 2.2 Joins 模糊查询 2.3 使Joins支持一对多关系的查询 2.4 Joins方法的错误示范

dorlolo的博客 8653

GORM框架中的预加载(Preloading)和连接查询(Joins)

在GORM中,Preload和Joins是两种非常强大的多表查询方法。Preload适用于Eager Loading场景,而Joins则提供了更多的灵活性来处理复杂的连接条件。根据具体的业务需求和数据模型,我们可以选择最合适的方法来优化数据库查询的性能和可读性。在实际应用中,我们还需要注意SQL注入的风险,特别是在使用Joins进行原始SQL连接查询时。始终使用参数化查询可以有效地防止SQL注入攻击。此外,随着业务的发展和数据模型的复杂化,我们可能需要编写更复杂的查询来满足新的需求。

qq_63644576的博客 2591

关于gorm的preload方法笔记

gorm预加载

weixin_50071922的博客 1548

gorm多表联合查询

使用golang 中的orm, 即gorm 进行多表联合查询 环境: Gin, gin-vue-admin, mysql 1、定义get请求参数 type ReqArticleItem struct { Page int. `form: page` PageSize int `form:"pageSize"` CategoryNameCn string `form:"categoryNameCn"` ContentNameCn string `form:"contentNa

面向未来的历史 1万+

关于gorm多表联合查询(left join)的小记

Golang很流行,但是有些方面资料很少而且不详实,譬如:gorm的联合查询,当然,也不推荐复杂语句使用orm模型。 现将自己总结的写法和遇到的坑记录如下: Golang要求使用“驼峰命名法”,比如systemId,因为我以前用的是Python,使用Django的orm序列化后返回的参数和数据库表字段一致,基于这个不适合Go的思路,我将表字段也建成了systemId,和struct映射参数相同。(...

f95_sljz的博客 3万+

Gin之GORM的表关联查询操作详解

先查看下要操作的两张表:carton//关系如下:// 一个章节对应一个动漫(一对一;两种方法:belong to;has one)// 一个动漫可以对应多个章节(一对多)

阿澈不吃蒜的博客 2942

GORM框架中的预加载功能Preload详解

在使用 GORM 进行数据库操作时,Preload 是一种非常有用的功能,它用于预加载与某个模型相关联的其他模型。本文介绍了Preload 的适用性以及使用Preload前后的性能变化。

技术卷的博客 2441

Golang Gorm 一对多 preload预加载

的数据,gorm就提前把这张表全部取出来,然后再执行。,最后把两种数据一一对应起来。

小楼一夜听春雨,深巷明朝卖杏花 2607

lambdaquerywrapper查询指定字段_SQL | 表的加法-多表查询

1、表的加法加法:UNION 语句:SELECT <字段>,<字段>FROM <表名>UNION ALL(ALL保留重复行)SELECT <字段>,<字段>FROM<表名>练习:SELECT * FROM course UNION ALL SELECT * FROM course1结果:2、表的联结交叉联结(笛卡尔积) CRO...

weixin_39968852的博客 2万+

[golang gin框架] 8.Gin GORM原生 SQL以及表关联查询

gin gorm 原生 SQL 和 SQL 生成器, Gin 中使用 GORM 实现表关联查询,一对一,一对多,多对多,Preload,gorm:"foreignKey", references,gorm:many2many

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 3320
下一篇: golang 时区问题以及time包下常用的一写函数和方法
dingCode
博客等级 码龄8年 16粉丝 11原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值