go语言的database/sql结合squirrel工具sql生成器完成数据库操作

database/sql

database/sql是go语言内置数据库引擎,使用sql查询数据库,配置datasource后使用其数据库操作方法对数据库操作,如下:

package mainimport ("database/sql""fmt"_ "github.com/Masterminds/squirrel"_ "github.com/go-sql-driver/mysql"
)func main() {datasource := "root:root@tcp(192.168.42.128:3306)/test"sqlDB, err := sql.Open("mysql", datasource)if err != nil {panic(err)}defer sqlDB.Close()r := sqlDB.QueryRow("select * from user")type User struct {Id       intAccount  stringPassword string}var user Usererr = r.Scan(&user.Id, &user.Account, &user.Password)if err != nil {panic(err)}fmt.Println(user)//squirrel.Select("")
}

在这里插入图片描述

在这里插入图片描述

除了原生的方法外许多orm框架也是对sql进行了封装,如gorm,xorm等。使用原生database/sql就需要编写sql语句。

database/sql方法传入的是sql的字符串,再使用squirrel生成sql。

squirrel

squirrel是一个sql生成工具,能够帮助开发者快速构建sql,避免拼接原生sql,原生sql语句一般是很长的,特别是多表联查的时候。squirrel能够避免直接拼接太长SQL的过程,简化书写。

github地址

首先介绍squirrel的四大结构体

  • SelectBuilder
  • UpdateBuilder
  • InsertBuilder
  • DeleteBuilder

这些结构体都没有成员变量,都是用来实实现具体方法构造SQL的,其归属其类型都是builder.Builder

但是由于不用DDL,DML的区别,这些结构体也会实现不同的方法,例如

select * from `user` where `id` = 1 inner join order on `user.orderid` = `order.id`
update `user` set `password` = 123456
delete from `user` where `id` = 1
insert into `user` (....) values (....)

在上述CURD中,不同的语句具有不同的关键字,这是四大结构体就会实现具体的方法,返回特定sql构造结构体。

在这里插入图片描述
在这里插入图片描述
那么就可以使用squirrel构造sql了,显然方法参数是sql的变量。

s, i, err := squirrel.Select("*").From("user").ToSql()
if err != nil {panic(err)
}
fmt.Println(s)
fmt.Print(i)

在这里插入图片描述

可以看到ToSql方法返回三个参数,分别是sql语句和参数为切片类型,代码所示没有传入参数因此未一个空切片。

ub := squirrel.Update("user").Set("password", 12345678).Where("id", 1)
s, i, _ := ub.ToSql()
fmt.Printf("sql = %s,elem = %v\n", s, i)ub1 := squirrel.Update("user").Set("password = ?", 12345678).Where("id = ?", 1)
s1, i1, _ := ub1.ToSql()
fmt.Printf("sql = %s,elem = %v\n", s1, i1)s2, i2, _ := squirrel.Delete("user").Where("id = ?", 1).ToSql()
fmt.Printf("sql = %s,elem = %v\n", s2, i2)

在这里插入图片描述

通过上面的测试可以发现set关键字后面只能是=因此会自动拼接,where后面不一定是=所以不会自动拼接。

数据库操作的关键是条件查询,对于where关键字来说是传入变量最多的,通过上述案例可以知道如下的传参方式:

s, i, err := squirrel.Select("*").From("user").Where("id = ? and name = ? and password = ?", 1, "xiaoux", "12345678").ToSql()
fmt.Printf("%s,%v,%v\n", s, i, err)

在这里插入图片描述

这样依旧可以传参成功但是并没有简便多少,另外squirrel还提供squirrel.Eq来传参

s2, i2, err2 := squirrel.Select("*").From("user").Where(squirrel.Eq{"id": 1, "name": "xiaoxu", "password": "123456"}).ToSql()
fmt.Printf("%s,%v,%v\n", s2, i2, err2)

在这里插入图片描述
和前一个生成sql一样,但是却更具有可观性。squirrel不支持结构体作为参数,只支持string和map两种类型。

s, i, err := squirrel.Select("user.id", "user.name", "order.id", "order.name").From("user").Where("user.orderid = order.id").Join("order").ToSql()
fmt.Println(s, i, err)

在这里插入图片描述

Squirrel 本身并不是一个直接用于执行数据库查询的库。它是一个 SQL 查询构建器,旨在简化动态生成和构造复杂 SQL 查询语句的过程。

使用 Squirrel,你可以通过链式调用方法来构建 SQL 查询,包括选择要返回的列、指定表名、添加条件、排序、限制结果等。但是,要执行实际的数据库查询,你还需要借助一个具体的数据库驱动程序或 ORM 库。

在 Go 语言中,database/sql 包提供了与数据库交互的通用接口,而各种数据库驱动程序(如 MySQL、PostgreSQL、SQLite 等)则实现了这个接口。你可以结合使用 Squirrel 和适当的数据库驱动程序来执行查询。当然也可以是其他数据库驱动程序。

总结而言,Squirrel 可以辅助你构建复杂的 SQL 查询语句,但要执行实际的数据库查询,你需要结合具体的数据库驱动程序或 ORM 库来完成。

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

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

相关文章

Cesium 1.107+ 自定义类支持 readyPromise

由于cesium 1.107 的图元(Primitive) 已经不支持 readyPromise。 但是个人感觉比较好用,于是用了一个插件来实现。 用法: // 定义图元并添加,和之前一样 const boxGreen new BoxPrimitive({color: "#ff0000" }) viewer.scene.primitives.add(boxGreen.primitive)/…

【Spring专题】Bean的声明周期流程图

前言 我向来不主张【通过源码】理解业务,因为每个人的能力有限,甚至可能会因为阅读错误导致出现理解上的偏差,所以我决定,还是先帮大家【开天眼】,先整体看看流程图,好知道,Spring在写源码的过…

一文讲述什么是数字孪生?

当前世界正处于百年未有之大变局,数字经济在各国已成为经济发展的重点。数字经济也是我国社会经济发展的必经之路。 近些年,大数据、人工智能、数字孪生等技术的发展促使技术与国内各产业进一步融合,从而推动了各产业在智能化、数字化等方面…

程序猿成长之路之密码学篇-分组密码加密模式及IV(偏移量)的详解

Cipher.getInstance("AES/ECB/PKCS5Padding"); Cipher cipher Cipher.getInstance("AES/CBC/PKCS5Padding"); 在进行加解密编程的时候应该有很多小伙伴接触过以上的语句,但是大伙儿在编码过程中是否了解过ECB/CBC的含义、区别以及PKCS5Padding…

10个AI绘图生成器让绘画更简单

AI不仅影响商业和医疗保健等行业,还在创意产业中发挥着越来越大的作用,开创了AI绘画生成器新时代。在绘画领域当然也是如此,与传统的绘画工具不同,AI人工智能时代的绘画工具是全自动的、智能的,甚至可以说是“傻瓜式”…

Three.js阴影

目录 Three.js入门 Three.js光源 Three.js阴影 Three.js纹理贴图 使用灯光后,场景中就会产生阴影。物体的背面确实在黑暗中,这称为核心阴影(core shadow)。我们缺少的是落下的阴影(drop shadow)&#…

【ultralytics仓库使用自己的数据集训练RT-DETR】

ultralytics仓库使用自己的数据集训练RT-DETR RT-DETR由百度开发,是一款尖端的端到端物体检测器(基于transformer架构),在提供实时性能的同时保持高精度。它利用视觉变换器(ViT)的力量,通过解耦…

水库大坝安全监测系统实施方案

一、方案概述 水库大坝作为特殊的建筑,其安全性质与房屋等建筑物完全不同,并且建造在地质构造复杂、岩土特性不均匀的地基上,目前对于大坝监测多采用人工巡查的方法,存在一定的系统误差,其工作性态和安全状况随时都在变…

SSH连接阿里服务器搭建JAVA环境

SSH连接 1.IP录入 2.账户登录 3.右下角点击连接即可 安装JDK 1.查看是否存在jdk yum search jdk 2.安装JDK(不存在时) yum -y install java-1.8.0-openjdk* 3.安装完成 4.测试成功否 java -version 安装文件上传 yum -y install lrzsz 上传文件…

[git] git基础知识

git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目 git易于学习,性能极快 什么是版本控制? 版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况,可以记录文件修改历史…

微信开发之获取收藏夹列表的技术实现

简要描述: 获取收藏夹内容 请求URL: http://域名地址/weChatFavorites/favSync 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数…

将Linux上的cpolar内网穿透配置为开机自启动——“cpolar内网穿透”

将Linux上的cpolar内网穿透配置为开机自启动 文章目录 将Linux上的cpolar内网穿透配置为开机自启动前言一、进入命令行模式二、输入token码三、输入内网穿透命令 前言 我们将cpolar安装到了Ubuntu系统上,并通过web-UI界面对cpolar的功能有了初步了解。当然cpolar除…

黑马头条项目学习--Day3: 自媒体文章发布

Day3: 自媒体文章发布 Day3: 自媒体文章发布1) 素材管理-图片上传a) 前期微服务搭建b) 具体实现 2) 素材管理-图片列表a) 接口定义b) 具体实现 3) 素材管理-照片删除/收藏a) 图片删除a1) 接口定义a2) 代码实现 b) 收藏与取消b1) 接口定义b2) 代码实现 4) 文章管理-频道列表查询…

shell脚本之正则表达式

目录 一.常见的管道命令1.1sort命令1.2uniq命令1.3tr命令1.4cut命令1.5实例1.5.1统计当前主机连接状态1.5.2统计当前主机数 二.正则表达式2.1正则表达式的定义2.2常见元字符(支持的工具:find,grep,egrep,sed和awk&…

面试总结-c++

1该吹牛逼吹牛逼。在自己能说出个所以然的情况下,该吹就吹,不吹没工作,吹了有希望。 比如 c组长,确有其事,但是挺唬人。说自己在北京定居也是侧面吹牛逼,证明自己的能力。还有媳妇在研究所。 2.对自己做过…

【论文阅读】EULER:通过可扩展时间链接预测检测网络横向移动(NDSS-2022)

作者:乔治华盛顿大学-Isaiah J. King、H. Howie Huang 引用:King I J, Huang H H. Euler: Detecting Network Lateral Movement via Scalable Temporal Graph Link Prediction [C]. Proceedings 2022 Network and Distributed System Security Symposium…

【JavaSpring】注解开发

注解开发定义bean 不指定名称 package org.example.service.impl;import org.example.dao.BookDao; import org.example.service.BookService; import org.springframework.stereotype.Component;Component public class BookServiceimpl implements BookService {private Bo…

QGIS开发五:VS使用QT插件创建UI界面

前面我们说了在创建项目时创建的是一个空项目,即不使用 Qt 提供的综合开发套件 Qt Creator,也不使用 Qt Visual Studio Tools 这类工具。 但是后面发现,如果我想要有更加满意的界面布局,还是要自己写一个UI文件,如果不…

pdf怎么压缩到1m?这样做压缩率高!

PDF是目前使用率比较高的一种文档格式,因为它具有很高的安全性,还易于传输等,但有时候当文件体积过大时,会给我们带来不便,这时候简单的解决方法就是将其压缩变小。 想要将PDF文件压缩到1M,也要根据具体的情…

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62

一、XtraBackup 简介 Percona XtraBackup是一个开源的MySQL和MariaDB数据库备份工具,它能够创建高性能、一致性的备份,并且对生产环境的影响很小。Percona XtraBackup通过在不停止MySQL服务器的情况下,复制InnoDB存储引擎的数据文件和事务日…