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代码演示具体操作步骤数学模型。 阅读详情

相关推荐

看我如何用kali实时截获隔壁"小姐姐"的上网隐私(结尾有彩蛋)

看我如何用kali实时截获隔壁"小姐姐"的手机图片等信息(结尾有彩蛋哦) 首先圈下重点:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或...

SoulCat 2万+

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

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

tr6666的博客 1898

从维纳滤波到Richardson-Lucy:图像去模糊算法的原理与实践

本文深入解析了图像去模糊的核心原理,重点对比了维纳滤波与Richardson-Lucy两种经典去卷积算法。维纳滤波在频域进行快速权衡,适用于高斯噪声场景;而Richardson-Lucy算法基于泊松噪声模型迭代优化,更适用于天文、显微等科学成像。文章通过Python代码实践,详细阐述了PSF(点扩散函数)的关键作用及算法选型指南。

weixin_29285605的博客 386

关于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

基于YOLOv8的智能肿瘤检测系统:从图像到诊断的深度学习应用——含代码和论文

本文提出了一种基于YOLOv8深度学习的智能肿瘤检测系统,用于医学影像(CT/MRI/X光)的自动分析与诊断。针对传统人工阅片效率低、主观性强的问题,系统采用最新的YOLOv8目标检测算法,通过改进的C2F骨干网络、Anchor-Free检测头和解耦头等创新设计,实现高效精准的肿瘤定位。文章详细阐述了模型架构、数据处理流程、训练优化方法及PyQt5用户界面开发,为临床提供可靠的AI辅助诊断工具。实验结果表明,该系统在速度和准确率上达到良好平衡,有望提升肿瘤早期筛查效率。

FJN110的博客 199

面向可扩展的 ABAP CDS:EXTEND VIEW 全面实战与工程化指引

摘要: 本文深入讲解ABAP CDS的EXTEND VIEW功能,帮助开发者在标准或自建模型上安全扩展字段与关联。核心内容包括: 作用:避免直接修改标准CDS,通过轻量扩展添加业务字段和关联,降低维护风险。 语法要点:需定义CDS扩展实体名和Dictionary Append View名,支持添加普通字段、关联,但不允许聚合或修改原有结构。 限制:不能扩展含聚合、UNION的视图,且扩展字段需避免命名冲突。 工程实践:建议使用客户命名空间,区分结构扩展与元数据扩展,并注意功能性变更需通过其他方式实现。 示例

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

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

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

BASK2311的博客 1097

复现《水化硅铝酸钙微结构和性能的分子动力学模拟研究》的分子动力学模拟

本文详细复现了杨军博士论文中关于水化硅铝酸钙(C-A-S-H)凝胶的分子动力学模拟方法。研究内容包括:1)基于11Å Tobermorite构建C-A-S-H分子模型,通过缺陷引入和Al掺杂调节Ca/Si比;2)使用ReaxFF力场模拟交联C-A-S-H的结构与力学性能;3)采用ClayFF力场研究纳米孔道中水和离子传输行为。研究提供了完整的LAMMPS输入脚本、Python分析代码和力场参数设置,为水泥基材料纳米尺度模拟提供可复现的技术方案。

huanghm88的专栏 105

[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万+

ESP32-IDF开发之旅 外设篇④ 串口通信 Uart

ESP32-S3 UART串口通信详解 本文介绍了ESP32-S3的UART串口通信配置流程,涵盖硬件引脚分配、参数设置、数据收发等关键步骤。

单片机菜鸟哥的博客 495

【100%通过率】华为OD机试真题 Python【数字最低位排序】【最低位排序】

2023华为OD机试真题 Python【数字最低位排序】【最低位排序】 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位

MISAYAONE的博客 1901

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

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

hotqin888的专栏 1万+

QCC51XX---人机接口设备协议( HID)

QCC51XX---人机接口设备协议( HID)

weixin_42162924的博客 819

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

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

m0_51671161的博客 4335

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

qq_43490312的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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、付费专栏及课程。

余额充值