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的情况

posted @ 2022-03-22 10:40  aganippe  阅读(1197)  评论(0编辑  收藏  举报