Go语言库系列之dotsql详解

导读:能单独拎出SQL文件的某一行或几行执行,是不是非常有趣?今天我们来介绍一下这个有意思的库--dotsql。

背景介绍

dotsql不是ORM,也不是SQL查询语句的构建器,而是可以在一个SQL文件中拎出某几行来执行的工具,非常类似于ini配置文件的读取。如果还不理解,我们来看如下内容。

-- name: create-users-table
CREATE TABLE users (
 id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
 name VARCHAR(255),
 email VARCHAR(255)
);

-- name: create-user
INSERT INTO users (name, email) VALUES(?, ?)

-- name: find-users-by-email
SELECT id,name,email FROM users WHERE email = ?

-- name: find-one-user-by-email
SELECT id,name,email FROM users WHERE email = ? LIMIT 1

-- name: drop-users-table
DROP TABLE users

上面是SQL文件中定义的语句,我们可以很清晰地看出,每条语句上方都以 -- name 的方式打上了“注解”,而作为开发人员,可以根据打了标记的名称挑选语句执行。

快速上手
准备工作

目录结构概览

├── data.sql
├── go.mod
├── go.sum
└── main.go

初始化项目

go mod init dotsql

创建data.sql文件,键入如下SQL,只是示例,内容可以自定义。

-- name: create-users-table
DROP TABLE IF EXISTS users;
CREATE TABLE users (
 id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
 name VARCHAR(255),
 email VARCHAR(255)
);

-- name: create-user
INSERT INTO users (name, email) VALUES(?, ?)

-- name: find-users-by-email
SELECT id,name,email FROM users WHERE email = ?

-- name: find-one-user-by-email
SELECT id,name,email FROM users WHERE email = ? LIMIT 1

--name: drop-users-table
DROP TABLE users

为了方便,我们用sqlite来演示,并存储在内存当中,所以要先安装sqlite驱动

go get github.com/mattn/go-sqlite3

代码演示

现在来写代码,导入go-sqlite3库

import _ "github.com/mattn/go-sqlite3"

获取sqlite3的数据库句柄

db, _ := sql.Open("sqlite3", ":memory:")

加载data.sql文件

dot, _ := dotsql.LoadFromFile("data.sql")

挑选文件中的一个标签来执行,Exec方法的第一个参数需要传入句柄

dot.Exec(db, "create-users-table")

从注释可以找到对应的语句,是一个创建表的操作

-- name: create-users-table
DROP TABLE IF EXISTS users;
CREATE TABLE users (
 id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
 name VARCHAR(255),
 email VARCHAR(255)
);

再来执行第二条语句,插入表数据

dot.Exec(db, "create-user", "User Name", "main@example.com")

我们再来尝试查询表数据,这里要注意,目前所有的操作都是基于定义的标签来选择执行的

rows, _ := dot.Query(db, "find-users-by-email", "main@example.com")
 var (
  id int
  name string
  email string
 )
 for rows.Next() {
  rows.Scan(&id, &name, &email)
  fmt.Println(id, name, email)
 }

Query方法返回的是*sql.Rows类型,同学们可以自行遍历取值测试,大功告成!

其他玩法

我们可以先预准备SQL语句,再在合适的时机执行

stmt, err := dot.Prepare(db, "drop-users-table")
result, err := stmt.Exec()

同样,我们也可以将多个SQL文件合并再进行取值操作

dot1, err := dotsql.LoadFromFile("queries1.sql")
dot2, err := dotsql.LoadFromFile("queries2.sql")
dot := dotsql.Merge(dot1, dot2)

总结

到此这篇关于Go语言库系列之dotsql的文章就介绍到这了,更多相关go语言库 dotsql内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Go语言库系列之flag的具体使用

    背景 终端(命令行)操作是程序员的必备技能,但是你知道怎么通过golang制作出如下命令吗? $ flag girl -h Usage of girl: -height int 身高 (default 140) $ flag girl --height 170 恭喜你获得了身高 170 的女朋友 极速上手 整个实现非常简单,只需要5个步骤 第一步,引库 import "flag" 第二步,定义变量 定义该变量的作用是存储命令行参数传来的值 var height int 第三步,配置命令

  • Go语言库系列之dotsql详解

    导读:能单独拎出SQL文件的某一行或几行执行,是不是非常有趣?今天我们来介绍一下这个有意思的库--dotsql. 背景介绍 dotsql不是ORM,也不是SQL查询语句的构建器,而是可以在一个SQL文件中拎出某几行来执行的工具,非常类似于ini配置文件的读取.如果还不理解,我们来看如下内容. -- name: create-users-table CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VA

  • Go gorilla securecookie库的安装使用详解

    目录 简介 快速使用 使用 JSON 自定义编解码 Hash/Block 函数 更换 Key 总结 简介 cookie 是用于在 Web 客户端(一般是浏览器)和服务器之间传输少量数据的一种机制.由服务器生成,发送到客户端保存,客户端后续的每次请求都会将 cookie 带上.cookie 现在已经被多多少少地滥用了.很多公司使用 cookie 来收集用户信息.投放广告等. cookie 有两大缺点: 每次请求都需要传输,故不能用来存放大量数据: 安全性较低,通过浏览器工具,很容易看到由网站服务器

  • C语言动态内存分配的详解

    C语言动态内存分配的详解 1.为什么使用动态内存分配 数组在使用的时候可能造成内存浪费,使用动态内存分配可以解决这个问题. 2. malloc和free C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放. (1)void *malloc(size_t size); malloc的参数就是需要分配的内存字节数.malloc分配一块连续的内存.如果操作系统无法向malloc提供更多的内存,malloc就返回一个NULL指针. (2)void free(void *poi

  • 易语言“是否支持多用户”命令详解

    检查本支持库所提供的数据库功能是否支持多用户同时对数据库操作.如果支持,返回真,否则返回假. 语法: 逻辑型 是否支持多用户 () 例程: 说明: 是否支持多用户命令,是检查当前的数据库,是否支持多用户同时进行操作,在检查数据库前,要先把待检查的数据库打开,如果本数据库支持多用户则返回真,否则,返回假. 用存放返回值的变量存放是否支持多用户命令的返回值,最后,用信息框查看本命令的返回值.如果此数据库支持多用户,信息框会显示"真",否则,显示"假". 到此这篇关于易语

  • 易语言数据库的“取库文件名”命令详解

    返回当前数据库的全路径文件名.如果当前数据库不存在,返回空文本. 语法: 文本型 取库文件名 () 例程: 说明: 启动窗口创建完毕后,打开2个数据库,并将打开数据库的全路径文件名存放再数组变量"已打开数据库名"中,当点击"显示库文件名"按钮,就将已经打开数据库的全路径文件名显示在列表框中,并显示出当前数据库名. 以上就是易语言数据库的"取库文件名"命令详解的详细内容,更多关于易语言取库文件名命令的资料请关注我们其它相关文章!

  • C语言入门之基础知识详解

    一.思维导图 内容不限于此思维导图 二.环境搭建 对于老手,自动跳过这一趴吧,或者也可以看一下我有没有啥纰漏,毕竟小白需要这一趴. 编译器很多,大部分老师会在学生学习C语言的时候推荐使用VC,不带语言提示器的那种,说是可以提高学生的编码能力.我也不知道到底是不是这么一回事儿.我推荐使用VS,这样学的快,函数记不住的问题很严重吗?项目的车轮碾压过去,再记不住也得记住吧!!! 更何况这个系列到后面是会有需要用文本文件编程写项目的阶段. 下载VS2019社区版,不要标新立异选那些最新版的,出了问题到时

  • C语言之system函数案例详解

    来看看在windows操作系统下system () 函数详解(主要是在C语言中的应用) 注意:在windows下的system函数中命令可以不区别大小写! 函数名: system 功 能: 发出一个DOS命令 用 法: int system(char *command); system函数已经被收录在标准c库中,可以直接调用. 例如: #include<stdio.h> #include<stdlib.h> int main() { printf("About to sp

  • C语言MultiByteToWideChar和WideCharToMultiByte案例详解

    目录 注意: 一.函数简单介绍 ( 1 ) MultiByteToWideChar() ( 2 ) WideCharToMultiByte() 二.使用方法 ( 1 ) 将多字节字符串转为宽字符串: ( 2 ) 从宽字节转为窄字节字符串 三.MultiByteToWideChar()函数乱码的问题 注意: 这两个函数是由Windows提供的转换函数,不具有通用性 C语言提供的转换函数为mbstowcs()/wcstombs() 一.函数简单介绍 涉及到的头文件: 函数所在头文件:windows.

  • Python数学建模PuLP库线性规划入门示例详解

    目录 1.什么是线性规划 2.PuLP 库求解线性规划 -(0)导入 PuLP库函数 -(1)定义一个规划问题 -(2)定义决策变量 -(3)添加目标函数 -(4)添加约束条件 -(5)求解 3.Python程序和运行结果 1.什么是线性规划 线性规划(Linear programming),在线性等式或不等式约束条件下求解线性目标函数的极值问题,常用于解决资源分配.生产调度和混合问题.例如: max fx = 2*x1 + 3*x2 - 5*x3 s.t. x1 + 3*x2 + x3 <=

  • 利用Python多处理库处理3D数据详解

    今天我们将介绍处理大量数据时非常方便的工具.我不会只告诉您可能在手册中找到的一般信息,而是分享一些我发现的小技巧,例如tqdm与 multiprocessing​imap​​一起使用.并行处理档案.绘制和处理 3D 数据以及如何搜索如果您有点云,则用于对象网格中的类似对象.​ 那么我们为什么要求助于并行计算呢?如今,如果您处理任何类型的数据,您可能会面临与"大数据"相关的问题.每次我们有不适合 RAM 的数据时,我们都需要一块一块地处理它.幸运的是,现代编程语言允许我们生成在多核处理器

随机推荐