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,否则会报错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS详细基础(二)文本样式

插播一条CSS的工作原理: CSS是一种定义样式结构如字体、颜色、位置等的语言,被用于描述网页上的信息格式化和显示的方式。CSS样式可以直接存储于HTML网页或者单独的样式单文件。无论哪一种方式,样式单包含将样式应用到指定类型的元素的规则。…

oracle 递归

1)此方法,父亲state 9999,儿子state ! 9999,儿子能查询出来 select * from T_ORGANIZATION ot where ot.state!9999 start with ot.id 7 connect by prior ot.id ot.ORG_PARENTID order by ot.id asc 2)此方法…

【node】发送邮件及附件简要使用说明

Nodemailer是一个用于Node.js应用程序的模块,可以轻松发送电子邮件。该项目始于2010年,当时没有合理的选项来发送电子邮件消息,如今它是大多数Node.js用户默认选择的解决方案。 一、环境配置 安装模块:nodemailer npm i nodema…

从代码操作层面解释什么是“面相对象编程”?

起因: 今天开了一个小会,会上朋友给我们说了一个事,Java项目上他开发一个小功能 用了很多代码,项目经理发现代码太多,说要优化一下,然后亲自帮同事优化,结果是查库的代码少了至少10条sql&#x…

Java如何解决浮点数计算不精确问题

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是浮点数计算不精确问题? 在 Java 中,浮点数计算不精确问题指的是使用浮点数进…

接口测试——接口协议抓包分析与mock_L2

目录: 抓包工具charles抓包工具fiddler抓包工具证书配置app抓包实战练习接口测试实战练习 1.抓包工具charles 工具介绍 支持 SSL 代理支持流量控制支持重发网络请求,方便后端调试支持修改网络请求参数支持网络请求的截获并动态修改可以自动将 json 或…

电子电子架构——AUTOSAR信息安全机制有哪些?(上)

电子电子架构——AUTOSAR信息安全机制有哪些(上) 我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要…

Mysql 子查询,最值查询

1.leetcode-184:查找部门内最高的薪水 首先是一个子查询,找出一个部门里最高的那个工资 随后查找最终需要的值,并且部门编号以及薪水应该包含在这个子查询中 最终答案: # Write your MySQL query statement below SELECT Depar…

爬虫获取一个网站内所有子页面的内容

上一篇介绍了如何爬取一个页面内的所有指定内容,本篇讲的是爬去这个网站下所有子页面的所有指定的内容。 可能有人会说需要的内容复制粘贴,或者直接f12获取需要的文件下载地址一个一个下载就行了,但是如下图十几个一级几十个二级一百多个疾病…

网工内推 | 网络工程师,软考证书优先,六险一金,包吃

01 科力信息 招聘岗位:网络工程师 职责描述: 1、负责蚌埠项目的设备安装及调试; 2、对边界网络运行中的监控、故障排除、问题处理。 任职要求: 1、2年及以上网络相关工作经验,有交通管理网络运维经验优先&#xff1b…

webview_flutter

查看webview内核 ​https://liulanmi.com/labs/core.html​ h5中获取设备 https://cloud.tencent.com/developer/ask/sof/105938013 https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator/mediaDevices web资源部署后navigator获取不到mediaDevices实例的解决方案&…

重新认识Java中的死锁问题

一、定义 多个进程因抢夺系统资源而产生相互等待的现象。 二、场景模拟 package com.gui.practise.thread.deadlock;public class DeadLock {private final Object resource1 new Object();//资源 1 private final Object resource2 new Object();//资源 2 public v…

前端架构师之路03_移动端规范兼容处理

1 移动端页面制作规范 1.1 计量单位的使用 CSS 的计量单位选择 px:固定的像素值em:相对父级元素的 font-size 设置来作为当前元素 1em 所代表的像素值,如父节点的 font-size:10px,当前节点的 font-size:1.2em,则当前节…

什么才是物联网领域最好的开发语言?

什么才是物联网领域最好的开发语言? 最好!运行最快?开发最高效?最容易学习? 各有特点! 采用C/C语言,运行最快,一般采用厂家提供的底层驱动支持包BSP,所有MCU都支持。如…

2009-2018年各省涉农贷款数据(wind)

2009-2018年各省涉农贷款数据(wind) 1、时间::209-2018年 2、范围:31省 3、来源:wind 4、指标:涉农贷款 指标解释 :在涉农贷款的分类上,按照城乡地域将涉农贷款分为农村贷款和城…

Spring 学习(五)JavaConfig 实现配置

1. 使用 JavaConfig 实现配置 JavaConfig 是 Spring 项目的一个子项目,Spring 4 后成为核心功能。 注意: 如果开启包扫描,加载配置类以后就可以通过反射拿到配置类中的对象了。Bean 只写在方法上,返回的是一个对象,但…

Django的设计模式及模板层

Django的设计模式及模板层 设计模式MVC和MVT MVC 代表 Model-View-Controller(模型-视图-控制器)模式。 M 模型层(Model),主要用于对数据库层的封装 V 视图层(View),用于向用户展示结果 (WHAT HOW) C 控制(Controller,用于处理请求、获取数据、返回结果(重要) 作…

SpringMVC 学习(六)乱码问题

8. 乱码问题 网络编程中乱码绝大部分都与编码格式有关,常常在涉及到中文的文件编译或者数据传输中出现。 Spring MVC 使用 post 方式传输带中文数据时便会出现乱码,get 方式则不会,解决方式如下: (1) 自定义过滤器 过滤器 pu…

记录使用iText7查找PDF内容关键字坐标,加盖电子签名、印章

一、前言 项目以前签字都是由C端那边进行合成操作,最近项目要求把那块功能,由后端进行实现,其中包含坐标、关键字、任意位置进行签字操作,坐标是最容易实现的,曾经也写过类似的功能在(添加图片印章到PDF&a…

如何做好测试?(三)功能测试 (Functional Testing, FT)

1. 功能测试的详细介绍: 功能测试 (Functional Testing, FT),是一种软件测试方法,旨在验证系统的功能是否按照需求规格说明书或用户期望的方式正常工作。它关注系统的整体行为,以确保各个功能模块和组件之间的交互和集成正确。 …