xorm数据库操作之Join、Union
golang的数据库操作xorm使用起来非常方便,不用再自己写SQl语句,而且xorm自己给我们做了SQL防注入等操作,用起来既方便又安全。此次文章我不会记录xorm的基本操作,我值记录一些特殊用法问题,包括动态创建表单、基于xorm的联合查询、基于xorm的跨表查询。
首先是基于xorm的数据库连接的创建:代码如下
import ("github.com/go-xorm/xorm"
)engine, err := xorm.NewEngineGroup("mysql","root:password@tcp(127.0.0.1:3306)/dbname?charset=utf8")
if err != nil {log.Fatal("创建lgoxorm引擎失败", err)return nil}
engine.SetMaxIdleConns(dbMaxIdleConns) //连接池的空闲数大小
engine.SetMaxOpenConns(dbMaxOpenConns) //设置最大打开连接数
engine.SetConnMaxLifetime(dbMaxLiftTime) //设置连接的最大生存时间
engine.ShowSQL(true) //显示每次xorm操作数据库打印SQL语句,可以注释掉
后面的操作就完全使用engine这个数据库句柄来操作数据库
1、动态创建数据库表单
我目前遇到的需求是这样的,在开发过程中,有这么一种情况,数据库表单的键值是完全一样的,用一个结构体表示就可以了,但是表需要多个,而且名字需要动态的添加,有一个资源对应的请求来,然后平台根据资源的信息创建一个专属的表,这样就形成了不同表名,表键值完全一样的情况。经过多次尝试,最后找到了如下方法:
type tablestruct struct {Id int `json:"id" xorm:"pk autoincr comment('自动生成id')"`Name string `json:"name" xorm:" comment('姓名')"`Info string `json:"info" xorm:"varchar(1024) comment('信息,长度为1024,不指定默认长度为255')"`
}//动态创建数据table方法1:
engine.Table("newtable1").CreateTable(&tablestruct{})//动态创建数据table方法2:
engine.Table("newtable2").Sync2(&tablestruct{})//查询表是否存在,不存在则使用上面两种方法进行动态创建数据库,表名字可以自定义
has, _ := engine.IsTableExist("newtable1")
if has{//已经存在表
}
CreateTable新建数据库新建的时候如果名字一样,则会报错,这种如果tablestruct有更新,也不会更新到后台;Sync2方法是同步或者新建数据库表,就算存在表名也不会出错,而且如果tablestruct有更新,会同步更新字段到表单,所以我一般用第二种方法来动态新建表。
2、基于xorm的联合查询
联合查询在mysql里面的关键字是join,连表查询存在两种情况,一种就是我只取其中一个表的数据,联表查询的另一个表只是作为查询条件作用;还有一种就是联表查询需要查询两个表的数据。
join含有三个参数:第一个参数是INNER, LEFT中的一个值, 第二个参数被联合查询的表名,可以为字符串或者bean, 第三个参数为连接条件
我下面只记录两种常见也是我用的比较多的情况,inner和left,我建了两张表,一张是叫resource,表示存储的资源信息,另一一张表叫whitelistdata,表示存储的IP白名单,下面我将用这两个表来展示join的用法:目前两个表的内容如下所示:
表whitelistdata内容:
表resource内容:
首先是inner join(等值连接) 只返回两个表中联结字段相等的行
inner的意思是将满足条件的两个表的数据组合成新的数据成为一个新的表,最后的功能是获取资源的ip在白名单的ip里面的数据,操作代码如下所示:
engine.Table("resource").Join("inner", "whitelistdata", "resource.ip=whitelistdata.ip").select("*")//等价于执行如下mysql语句,最后返回的结果是两个表的组合的数据:
//SELECT * FROM resource inner join whitelistdata on resource.ip=whitelistdata.ip;//如果只想通过筛选获取resource的数据
engine.Table("resource").Join("inner", "whitelistdata", "resource.ip=whitelistdata.ip").select("resource.*")
//等价于mysql语句
//SELECT resource.* FROM resource inner join whitelistdata on resource.ip=whitelistdata.ip;
数据库的执行结果如下所示如下两条数据:
然后再使用Find指令将查询的数据保存在数组当中。
然后是left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
left是返回包括左表中的所有记录和右表中联结字段相等的记录 ,真实逻辑也是将两个表组合根据查询条件查询出数据,左表数据是全部返回的,如果有不满足条件,则右边用null来填充,操作代码如下:
engine.Table("resource").Join("left", "whitelistdata", "resource.ip=whitelistdata.ip").select("*")//等价于执行如下mysql语句,最后返回的结果是两个表的组合的数据:
//SELECT * FROM resource left join whitelistdata on resource.ip=whitelistdata.ip;//如果只想通过筛选获取resource的数据
engine.Table("resource").Join("left", "whitelistdata", "resource.ip=whitelistdata.ip").select("resource.*")
//等价于mysql语句
//SELECT resource.* FROM resource left join whitelistdata on resource.ip=whitelistdata.ip;
数据库的执行结果如下所示如下图所示:
然后left还有一种用法就是:需要查询左边数据,不满足那个条件查询的数据,即查询满足条件查询的剩余不满足条件的数据,操作命令如下:
engine.Table("resource").Join("left", "whitelistdata", "resource.ip=whitelistdata.ip").select("*").where("whitelistdata.ip=?",nil)//等价于执行如下mysql语句,最后返回的结果是两个表的组合的数据:
//SELECT * FROM resource left join whitelistdata on resource.ip=whitelistdata.ip where whitelistdata.ip is null;
查询结果如下:
3、基于xorm的跨表查询
因为之前的数据库查询用的是xorm操作,但是我们遇到个需求需要联表查询,项目里面防止数据太,做了分表处理,所以查询的时候就存在跨表查询。但是xorm这个插件不存在直接的跨表查询,最后查阅了资料,发现可以使用xorm的builder模块来实现跨表查询,即mysql原生语句里面的union。这种情况是针对那些两个表的数据类型完全一致的情况适用。例子如下:
他的原理是先使用builder生成原生的sql语句,然后再使用xorm来执行语句,使用起来还是很方便
import ("xorm.io/builder""fmt"
)//使用builder组合union的查询mysql语句
sqlBuilder = builder.Select("*").From(agentlogstable+startMonth).Union("all", builder.Select("*").From(agentlogstable+endMonth))//转换成sql原生语句
sql, _, err := sqlBuilder.ToSQL()
if err != nil {//转换mysql语句错误fmt.Printfn("err = ",err.Error())}//生成最终builder格式的mysql查询语句
sqlBuilder = builder.Dialect(builder.MYSQL).Select("*").From("(" + sql + ") as newtb")//getdata是定义的存储数据的数组或者切片,获取跨表查询的数据
err = engine.SQL(sqlBuilder).Find(&getdata)
备注:查询的时候需要用:builder.Dialect(builder.MYSQL),不能用builder,否则会报错
相关文章:

xorm数据库操作之Join、Union
golang的数据库操作xorm使用起来非常方便,不用再自己写SQl语句,而且xorm自己给我们做了SQL防注入等操作,用起来既方便又安全。此次文章我不会记录xorm的基本操作,我值记录一些特殊用法问题,包括动态创建表单、基于xorm…...

排序:基数排序算法分析
1.算法思想 假设长度为n的线性表中每个结点aj的关键字由d元组 ( k j d − 1 , k j d − 2 , k j d − 3 , . . . , k j 1 , k j 0 ) (k_{j}^{d-1},k_{j}^{d-2},k_{j}^{d-3},... ,k_{j}^{1} ,k_{j}^{0}) (kjd−1,kjd−2,kjd−3,...,kj1,kj0)组成, 其中&am…...

用go实现http服务端和请求端
一、概述 本文旨在学习记录下如何用go实现建立一个http服务器,同时构造一个专用格式的http客户端。 二、代码实现 2.1 构造http服务端 1、http服务处理流程 基于HTTP构建的服务标准模型包括两个端,客户端(Client)和服务端(Server)。HTTP 请求从客户端…...

幂级数和幂级数的和函数有什么关系?
幂级数和幂级数的和函数有什么关系? 本文例子引用自:80_1幂级数运算,逐项积分、求导【小元老师】高等数学,考研数学 求幂级数 ∑ n 1 ∞ 1 n x n \sum\limits_{n1}^{\infty}\frac{1}{n}x^n n1∑∞n1xn 的和函数 ÿ…...

Git多账号管理通过ssh 公钥的方式,git,gitlab,gitee
按照目前国内访问git,如果不科学上网,我们很大可能访问会超时。基于这个,所以我现在的git 配置已经增加到了3个了 一个公司gitlab,一个git,一个gitee. 以下基于这个环境,我们来说明下如何创建配置ssh公钥。…...
在nodejs常见的不良做法及其优化解决方案
在nodejs常见的不良做法及其优化解决方案 当涉及到在express和nodejs中开发应用程序时。遵循最佳实践对于确保项目的健壮性、可维护性和安全性至关重要。 在本文中,我们将探索开发人员经常遇到的几种常见的错误做法,并通过代码示例研究优化的最佳做法&…...
关于layui upload上传组件上传文件无反应的问题
最近使用layui upload组件时,碰到了上传文件无反应的问题,感到非常困惑。 因为使用layui upload组件不是一次两次了,之前每次都可以,这次使用同样的配方,同样的姿势,为什么就不行了呢? 照例先…...

容器网络之Flannel
第一个问题位置变化,往往是通过一个称为注册中心的地方统一管理的,这个是应用自己做的。当一个应用启动的时候,将自己所在环境的 IP 地址和端口,注册到注册中心指挥部,这样其他的应用请求它的时候,到指挥…...
SVM(下):如何进行乳腺癌检测?
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。 🐴欢迎小伙伴们点赞👍🏻、收藏⭐️、…...

嵌入式Linux应用开发-第十五章具体单板的按键驱动程序
嵌入式Linux应用开发-第十五章具体单板的按键驱动程序 第十五章 具体单板的按键驱动程序(查询方式)15.1 GPIO操作回顾15.2 AM335X的按键驱动程序(查询方式)15.2.1 先看原理图确定引脚及操作方法15.2.2 再看芯片手册确定寄存器及操作方法15.2.3 编程15.2.3.1 程序框架15.2.3.2 硬…...

MySQL体系结构和四层架构介绍
MySQL体系结构图如下: 四层介绍 1. 连接层: 它的主要功能是处理客户端与MySQL服务器之间的连接(比如Java应用程序通过JDBC连接MySQL)。当客户端应用程序连接到MySQL服务器时,连接层对用户进行身份验证、建立安全连接并管理会话状态。它还处理…...

【产品运营】如何做好B端产品规划
产品规划是基于当下掌握的多维度信息,为追求特定目的,而制定的产品资源投入计划。 产品规划是基于当下掌握的多维度信息(客户需求、市场趋势、竞争对手、竞争策略等),为追求特定目的(商业增长、客户满意等&…...
ruoyi-启动
1 springboot 版本 git 地址 ruoyi-vue-pro: 🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot MyBatis Plus Vue & Element 实现的后台管理系统 微信小程序,支持 RBAC 动态权限、数据权限…...

select完成服务器并发
服务器 #include <myhead.h>#define PORT 4399 //端口号 #define IP "192.168.0.191"//IP地址//键盘输入事件 int keybord_events(fd_set readfds); //客户端交互事件 int cliRcvSnd_events(int , struct sockaddr_in*, fd_set *, int *); //客户端连接事件 …...

初级篇—第四章聚合函数
文章目录 聚合函数介绍聚合函数介绍COUNT函数AVG和SUM函数MIN和MAX函数 GROUP BY语法基本使用使用多个列分组WITH ROLLUP HAVING基本使用WHERE和HAVING的对比开发中的选择 SELECT的执行过程查询的结构SQL 的执行原理 练习流程函数 聚合函数介绍 聚合函数作用于一组数据&#x…...

计算机图像处理-中值滤波
非线性滤波 非线性滤波是利用原始图像跟模版之间的一种逻辑关系得到结果,常用的非线性滤波方法有中值滤波和高斯双边滤波,分别对应cv2.medianBlur(src, ksize)方法和cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])方法。 …...

Golang中的包和模块设计
Go,也被称为Golang,是一种静态类型、编译型语言,因其简洁性和对并发编程的强大支持而受到开发者们的喜爱。Go编程的一个关键方面是其包和模块系统,它允许创建可重用、可维护和高效的代码。本博客文章将深入探讨在Go中设计包和模块…...

web:[极客大挑战 2019]Upload
题目 页面显示为一个上传,猜测上传一句话木马文件 先查看源代码看一下有没有有用的信息,说明要先上传图片,先尝试上传含有一句话木马的图片 构造payload <?php eval($_POST[123]);?> 上传后页面显示为,不能包含<&…...

ICMP差错包
ICMP报文分类 Type Code 描述 查询/差错 0-Echo响应 0 Echo响应报文 查询 3-目的不可达 0 目标网络不可达报文 差错 1 目标主机不可达报文 差错 2 目标协议不可达报文 差错 3 目标端口不可达报文 差错 4 要求分段并设置DF flag标志报文 差错 5 源路由…...

算法基础课第二部分
算法基础课 第四讲 数学知识AcWing1381. 阶乘(同余,因式分解) 质数AcWing 866. 质数的判定---试除法AcWing 868. 质数的判定---埃氏筛AcWing867. 分解质因数---试除法AcWing 197. 阶乘---分解质因数---埃式筛 约数AcWing 869. 求约数---试除法AcWing 870. 约数个数-…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...