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

database/sql

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

package main

import (
	"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       int
		Account  string
		Password string
	}

	var user User
	err = 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 库来完成。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测

回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测; 2.运行环…

嵌入式:ARM Day1

1. 思维导图 2.作业一 3.作业2

MySQL入门学习教程(二)

上一篇文章讲的是mysql的基本操作,这一篇会有一点难以理解,本节主要内容mysql视图,存储过程,函数,事务,触发器,以及动态执行sql 视图view 视图是一个虚拟表,其内容由查询定义。同真…

day24-106.从中序与后序遍历序列构造二叉树

106.从中序与后序遍历序列构造二叉树 力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树&am…

一百五十二、Kettle——Kettle9.3.0本地连接Hive3.1.2(踩坑,亲测有效)

一、目的 由于先前使用的kettle8.2版本在Linux上安装后&#xff0c;创建共享资源库点击connect时页面为空&#xff0c;后来采用如下方法&#xff0c;在/opt/install/data-integration/ui/menubar.xul文件里添加如下代码 <menuitem id"file-openZiyuanku" label&…

【软件工程】软件测试

软件测试的对象 软件程序文档 测试对象&#xff1a;各个阶段产生的源程序和文档。 软件测试的目的 基于不同的立场&#xff0c;对软件测试的目的存在着两种完全对立的观点。 &#xff08;1&#xff09;一种观点是通过测试暴露出软件中所包含的故障和缺陷(从用户的角度)&#xf…

汇编指令练习

1.大小比较&#xff08;循环&#xff09; start: /*mov r0,#0x9mov r1,#0xfb LoopLoop:cmp r0,r1beq stopsubhi r0,r0,r1subcc r1,r1,r0b Loop stop:b stop.end 仿真图 2. 1到100之和 start:mov r0,#0x1mov r1,#0x0b sum sum:add r1,r1,r0add r0,r0,#0x1cmp r0,#0x65beq sto…

SRE之前端服务器的负载均衡

写在前面 今天和小伙伴们分享一些前端服务器的负载均衡技术内容为结合《 SRE Google运维解密》 整理&#xff1a; 涉及DNS 负载均衡VIP 负载均衡反向代理负载均衡 理解不足小伙伴帮忙指正 傍晚时分&#xff0c;你坐在屋檐下&#xff0c;看着天慢慢地黑下去&#xff0c;心里寂寞…

ARM--day2(cpsr、spsr、数据搬移指令、移位操作指令、位运算操作指令、算数运算指令、比较指令、跳转指令)

.text .global _gcd _gcd:mov r0,#9mov r1,#15b loop loop:cmp r0,r1beq stopsubhi r0,r1bhi loopsubcc r1,r0bcc loopstop:b stop.end用for循环实现1~100之间和5050 .text .global _gcd _gcd:mov r0,#0x0mov r1,#0x1mov r2,#0x64b loop loop:cmp r1,r2bhi stopadd r0,r0,r1ad…

0101xss入门及pikachu靶场-xss-web安全-网络安全

文章目录 0 概述1 环境准备2 反射型xss2.1 概述2.1 靶场-反射型xss&#xff08;get&#xff09; 3 存储型xss3.1 概述3.2 靶场-存储型xss 4 DOM型xss4.1 概述4.2 靶场-DOM型xss 5 问题总结6.1 再次启动pikachu容器报错 结语 0 概述 学习路线&#xff0c;如如下图所示&#xff…

前后端分离------后端创建笔记(03)前后端对接(上)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

[保研/考研机试] 杨辉三角形 西北工业大学复试上机题 C++实现

题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 输入n值&#xff0c;使用递归函数&#xff0c;求杨辉三角形中各个位置上的值。 输入描述: 一个大于等于2的整型数n 输出描述: 题目可能有多组不同的测试数据&#xff0c;对于每组输入数据&#xff0c; 按题目的要求输…

Java代理模式——静态代理与动态代理

代理模式 代理模式允许你为其他对象提供一个代理&#xff0c;以控制对这个对象的访问。代理模式在不改变实际对象的情况下&#xff0c;可以在访问对象时添加额外的功能。 可以理解为代理模式为被代理对象创造了一个替身&#xff0c;调用者可以通过这个替身去实现这个被代理对…

定长内存池设计ConcurrentMemoryPool

原理 还回来的内存用链表串联起来&#xff0c;称为自由链表 内存块自身进行链接&#xff0c;前四个字节存下一个的地址 结构 template<class T> class ObjectPool { public:T* New(){} private:char* _memory nullptr; //方便切割void* _freeList nullptr; };第一步…

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库&#xff0c;一套典型的移动端办公工具型APP Axure RP原型模板&#xff0c;可根据实际的产品需求进行扩展&#xff0c;也可以作为移动端原型设计的参考案例。为提升本作品参考价值&#xff0c;在模板设计过程中尽量追求…

uniapp 自定义手机顶部状态栏不生效问题

想要的效果想淘宝一样&#xff0c;底色覆盖到手机顶部&#xff0c;找了两天都没找到原因&#xff0c;过程很艰苦&#xff0c;直接上结果吧 项目是后来接手的&#xff0c;最终原因出在这&#xff0c; "immersed" : false>设置为 true 就可以了&#xff0c;沉浸式样…

RunnerGo的相比较JMeter优势,能不能替代?

目前在性能测试领域市场jmeter占有率是非常高的&#xff0c;主要原因是相对比其他性能测试工具使用更简单&#xff08;开源、易扩展&#xff09;&#xff0c;功能更强大&#xff08;满足多种协议的接口&#xff09;&#xff0c;但是随着研发协同的升级&#xff0c;平台化的性能…

Java智慧工地APP源码带AI识别

智慧工地为建筑全生命周期赋能&#xff0c;用创新的可视化与智能化方法&#xff0c;降低成本&#xff0c;创造价值。 一、智慧工地APP概述 智慧工地”立足于互联网&#xff0c;采用云计算&#xff0c;大数据和物联网等技术手段&#xff0c;针对当前建筑行业的特点&#xff0c;…

【Sklearn】基于朴素贝叶斯算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于朴素贝叶斯算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 模型原理&#xff1a; 朴素贝叶斯分类是基于贝叶斯定理的一种分类方法。它假设特征之间相互…

海康威视摄像头二次开发_云台控制_视频画面实时预览(基于Qt实现)

一、项目背景 需求:需要在公司的产品里集成海康威视摄像头的SDK,用于控制海康威视的摄像头。 拍照抓图、视频录制、云台控制、视频实时预览等等功能。 开发环境: windows-X64(系统) + Qt5.12.6(Qt版本) + MSVC2017_X64(使用的编译器) 海康威视提供了设备网络SDK,设备网…