sqlc使用说明
1. 什么是sqlc?
google sqlc doc可以看到sqlc官网对于自己的定位,其主要作用就是从SQL生成可直接调用的go接口
我们使用sqlc可以简单分为以下三个步骤:
- 写SQL
- run sqlc生成我们所需要的go查询接口
- 使用这些接口与数据库交互
sqlc doc:https://docs.sqlc.dev/en/stable/index.html
2. sqlc安装
macos安装
brew install sqlc
go install (go version>=1.17)
go install github.com/kyleconroy/sqlc/cmd/sqlc@latest
ubuntu
sudo snap install sqlc
docker(这种工具安装在docker上启动有些不方便)
docker pull kjconroy/sqlc
3. 从SQL到golang code
现在sqlc支持的数据库包括了MySQL和PostgreSQL,用法基本是一样的,下面我们就以postgres来看怎样让sqlc为我们生成sql查询的go code
首先我们cd到项目文件主目录,执行下面的指令生成sqlc.yaml文件,这个文件会配置一些sqlc的信息
sqlc init
在yaml文件中我们可以编写一些sqlc的初始化配置信息:
version: "1"
packages:
- name: "db" # package name
path: "./db/sqlc" # 生成的go code路径
queries: "./db/query/" # sql语句路径
schema: "./db/migration/" # 数据库架构
engine: "postgresql" # 什么数据库
emit_json_tags: true
emit_prepared_queries: false
emit_interface: true #生成一个所有query的接口文档
emit_exact_table_names: false
emit_empty_slices: true
当然在写ymal文件之前,我们需要做好一些准备工作:
- 创建上面用到的所有文件目录
- 创建数据库架构文件
然后我们就可以在query目录下编写我们需要的SQL语句了,让我们看看使用sqlc和我们自己写正常的sql有什么区别?
看官网的一个案例:
-- name: GetAuthor :one
SELECT * FROM authors
WHERE id = $1 LIMIT 1;
-- name: ListAuthors :many
SELECT * FROM authors
ORDER BY name;
-- name: CreateAuthor :one
INSERT INTO authors (
name, bio
) VALUES (
$1, $2
)
RETURNING *;
-- name: DeleteAuthor :exec
DELETE FROM authors
WHERE id = $1;
我们可以看到这和我们自己写sql并无不同,最大的区别就是每一句sql上面都会有一个注释
name: 后面的是我们要生成的那个go查询接口的方法名,再后后面的one、many、exec都有不同的含义:
- one:只有一个返回值
- many:多个返回值
- exec:没有返回值
好了,我们现在知道query.sql的简单编写规则了,我们可以根据自己的需求去修改:
-- name: CreateEntry :one
INSERT INTO entries (
account_id,
amount
) VALUES (
$1, $2
) RETURNING *;
-- name: GetEntry :one
SELECT * FROM entries
WHERE id = $1 LIMIT 1;
-- name: ListEntries :many
SELECT * FROM entries
WHERE account_id = $1
ORDER BY id
LIMIT $2
OFFSET $3;
可以看到我需要三个接口:
- CreateEntry:向entries表中插入数据,传入参数为account_id, amount,返回值是我们插入的这条数据
- GetEntry:获取指定id的信息,传入参数为id,返回值是我们需要的这一条信息
- ListEntries:获取一个account_id下多条转账信息,传入参数是account_id, limit, offest,返回值是多条符合要求的数据
现在让我们生成需要go code
sqlc generate
现在可以在db/sqlc文件夹下查看生成的go code
其实除了我们需要的entry.sql.go,还会生成三个.go文件,可以简单看一下里面都是些什么内容:
db.go:初始化了一个Queries结构,我们需要传入一个自己的db连接对象
models.go:就是将我们每个表的字段都做了一次结构体的封装
querier.go:定义一个接口,封装所有的sql查询接口
entry.sql.go:用go实现了我们刚才写的那些sql语句,一些输入和输出结构都用了struct来定义
至此我们就完全可以用go来与数据库实现交互了,sqlc的优势也很明显了,我们只需要写sql,而不需要关心go如何与sql进行交互的
同时sqlc还支持了语法错误的判断,而不存在我们在运行程序是因为sql出错而panic的情况