小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

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

Go,数据库,golang,sql 额外说明

收录于:17天前

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 库结合起来。

. . .

相关推荐

额外说明

--- PCIe基本概念普及(扫盲篇--非常适合新手)

转发:添加链接描述 PCIE由早期得PCI扩展衍生而来并且对兼容PCI,两者得主要区别在于并行到串行得切换,且速率更快。目前主板上越来越多得设备都挂载到PCI总线下面,甚至部分硬盘也会挂载PCI总线下面,可见PCIE得应用越来越广。PCIE设计的知识面比

额外说明

Java后台——点餐小程序点餐取号接口的编写

QQ 1274510382 Wechat JNZ_aming 商业互捧 QQ群538250800 技术搞事 QQ群599020441 技术合作 QQ群152889761 加入我们 QQ群649347320 纪年科技aming 网络安全 ,深度学习,嵌入式

额外说明

ECharts数据可视化——mainbox布局分析

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技am

额外说明

一小时吃透 R-CNN & Fast R-CNN & Faster R-CNN

一小时吃透 R-CNN & Fast R-CNN & Faster R-CNN 概述 目标检测算法 重点 SPP 池化 (2014) RPN 网络 ROI 池化 (2015) R-CNN (2013) Fast R-CNN (2015) Faster R

额外说明

【心情分享】自己心中的程序员和别人眼里的程序员

推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一、序章 我很少去写这种心情分享的文章,更多的是去分享一下技术。 还记得高中那会,总感觉自己才华过人,不是去写诗,就是去写小说,如

额外说明

提高开发效率:IntelliJ IDEA常用快捷键大全

目录 基本编辑 导航和搜索 代码重构 查找和替换 编译与运行 调试 IntelliJ IDEA作为一款强大的Java集成开发环境,提供了许多实用的快捷键,能够极大地提高开发效率和舒适度。在本文中,我们将列举一些常用的快捷键,帮助你更快地完成编码、导航、搜

额外说明

【Java 进阶篇】MySQL 数据库备份与还原

MySQL 是一款常用的关系型数据库管理系统,用于存储和管理数据。在数据库应用中,数据备份和还原是非常重要的操作,用于保护数据免受意外删除、损坏或数据丢失的影响。本文将详细介绍如何在 MySQL 中进行数据库备份和还原操作,包括常用的备份和还原方法以及相

额外说明

PostgreSQL 基础知识

执行环境: psql 1. 创建一个表格 CREATE TABLE customers ( customer_id serial PRIMARY KEY, firstname VARCHAR(100) NOT NULL, lastname VARCH

额外说明

PHP当中的常量及其声明

常量的特点: 1、使用 define() 函数来定义常量,在 PHP 5.3 以后,也可以使用 const 关键字在类定义之外定义常量。如果常量被定义,就不能再改变或者取消定义。  2、常量只能包含标量数据(boolean,integer,float 和

额外说明

wordpress付费阅读_2020年27个最佳WordPress杂志主题[免费+付费]

WordPress 付费阅读 您是否正在为您的网站寻找最佳的 WordPress 杂志主题? 您是否正在为您的网站寻找最佳的 WordPress 杂志主题? 内容丰富的网站需要不同的布局来帮助他们同时推广所有新的和重要的内容。 WordPress 杂志主

ads via 小工具