当前位置: 首页 > news >正文

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.lryc.cn/news/124675.html

相关文章:

  • LVS集群和分布式
  • 使用QT可视化设计对话框详细步骤与代码
  • TFTP Server
  • 登录验证码实现
  • 2. 获取自己CSDN文章列表并按质量分由小到大排序(文章质量分、博客质量分、博文质量分)(阿里云API认证)
  • 在Windows和MacOS环境下实现批量doc转docx,xls转xlsx
  • 【网络编程(二)】NIO快速入门
  • 【Vue-Router】嵌套路由
  • MySQL索引总结
  • 谷粒商城第十二天-基本属性销售属性管理功能的实现
  • 利用安全区域的概念解决移动端兼容不同手机刘海的问题
  • 数据结构---图
  • 励志长篇小说《周兴和》书连载之十八 内外交困搞发明
  • web基础入门和php语言基础入门 二
  • typeScript 之 Array
  • 【题解】二叉树的前中后遍历
  • 文件操作/IO
  • 基于Java+SpringBoot+vue前后端分离共享汽车管理系统设计实现
  • Mac RN环境搭建
  • log4j教程_编程入门自学教程_菜鸟教程-免费教程分享
  • DP——背包问题
  • 【从零学习python 】29. 「函数参数详解」——了解Python函数参数的不同用法
  • 10个经典战略分析模型,助力洞察市场明确优势
  • C++(Qt)软件调试---将调试工具安装到AeDebug(11)
  • 浅谈限流式保护器在住宅电气防火的应用
  • ChatGPT助力ModStartBlog,博客写作更智能
  • Jpa与Druid线程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑异常处理方案
  • Vue3组件库
  • AUTOSAR从入门到精通-【应用篇】基于 CAN/LIN 总线的智能配电监控系统的研究设计
  • 数据安全服务能力评定资格证书-申请流程