首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >go操作数据库之库sqlc

go操作数据库之库sqlc

作者头像
BUG弄潮儿
发布2025-06-07 18:12:04
发布2025-06-07 18:12:04
13500
代码可运行
举报
文章被收录于专栏:JAVA乐园JAVA乐园
运行总次数:0
代码可运行

1. 什么是sqlc?

google sqlc doc可以看到sqlc官网对于自己的定位,其主要作用就是从SQL生成可直接调用的go接口

我们使用sqlc可以简单分为以下三个步骤:

  • 写SQL
  • run sqlc生成我们所需要的go查询接口
  • 使用这些接口与数据库交互
代码语言:javascript
代码运行次数:0
运行
复制
sqlc doc:https://docs.sqlc.dev/en/stable/index.html

2. sqlc安装

macos安装

代码语言:javascript
代码运行次数:0
运行
复制
brew install sqlc

go install (go version>=1.17)

代码语言:javascript
代码运行次数:0
运行
复制
go install github.com/kyleconroy/sqlc/cmd/sqlc@latest

ubuntu

代码语言:javascript
代码运行次数:0
运行
复制
sudo snap install sqlc

docker(这种工具安装在docker上启动有些不方便)

代码语言:javascript
代码运行次数:0
运行
复制
docker pull kjconroy/sqlc

3. 从SQL到golang code

现在sqlc支持的数据库包括了MySQL和PostgreSQL,用法基本是一样的,下面我们就以postgres来看怎样让sqlc为我们生成sql查询的go code

首先我们cd到项目文件主目录,执行下面的指令生成sqlc.yaml文件,这个文件会配置一些sqlc的信息

代码语言:javascript
代码运行次数:0
运行
复制
sqlc init

在yaml文件中我们可以编写一些sqlc的初始化配置信息:

代码语言:javascript
代码运行次数:0
运行
复制
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有什么区别?

看官网的一个案例:

代码语言:javascript
代码运行次数:0
运行
复制
-- 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 (2 ) RETURNING *;

-- name: GetEntry :one SELECT * FROM entries WHERE id = $1 LIMIT 1;

-- name: ListEntries :many SELECT * FROM entries WHERE account_id = 2 OFFSET $3; 可以看到我需要三个接口:

  • CreateEntry:向entries表中插入数据,传入参数为account_id, amount,返回值是我们插入的这条数据
  • GetEntry:获取指定id的信息,传入参数为id,返回值是我们需要的这一条信息
  • ListEntries:获取一个account_id下多条转账信息,传入参数是account_id, limit, offest,返回值是多条符合要求的数据

现在让我们生成需要go code

代码语言:javascript
代码运行次数:0
运行
复制
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的情况

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 什么是sqlc?
  • 2. sqlc安装
  • 3. 从SQL到golang code
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档