您现在的位置是:首页 >学无止境 >sqlc代码生成工具网站首页学无止境
sqlc代码生成工具
简介sqlc代码生成工具
说明
sqlc是golang数据库代码自动生成工具,支持数据库支持mysql、sqlite、PostgreSQL,可通过配置快速生成golang代码。
分享
- 大数据博客列表
- 开发记录汇总
- 个人java工具库 项目https://gitee.com/wangzonghui/object-tool
- 包含json、string、集合、excel、zip压缩、pdf、bytes、http等多种工具,欢迎使用。
资料
安装sqlc
-
github 下载windows版sqlc并配置到环境变量
-
查看版本:
sqlc version
-
查看帮助:
sqlc help
单表生成代码
- 此处以sqLite为例
初始化项目
- 项目根目录下初始项目:
go mod init 项目名
创建yml初始文件
- 项目根目录执行:
sqlc init
,或者手动创建sqlc.yaml
文件,内容如下:
version: "2"
sql:
# 数据库类型
- engine: "sqlite"
# 表结构
schema: "schema.sql"
# 操作sql语句
queries: "query.sql"
gen:
go:
#生成文件目录
package: "tutorial"
out: "tutorial"
创建表结构语句
- 根目录创建表结构语句:
schema.sql
CREATE TABLE authors (
id INTEGER PRIMARY KEY,
name text NOT NULL,
bio text
);
创建查询sql语句
- 根目录创建表结构语句:
query.sql
-- name: GetAuthor :one
SELECT * FROM authors
WHERE id = ? LIMIT 1;
-- name: ListAuthors :many
SELECT * FROM authors
ORDER BY name;
-- name: CreateAuthor :one
INSERT INTO authors (
name, bio
) VALUES (
?, ?
)
RETURNING *;
-- name: DeleteAuthor :exec
DELETE FROM authors
WHERE id = ?;
-- name: UpdateAuthor :one
UPDATE authors
set name = ?,
bio = ?
WHERE id = ?
RETURNING *;
- 上面实例修改后返回记录,如果想不返回,使用如下方式
-- name: UpdateAuthor :exec
UPDATE authors
set name = ?,
bio = ?
WHERE id = ?;
生成代码
- cmd控制台执行:
sqlc generate
,将会在tutorial
目录生成三个文件:db.go、models.go、query.sql.go
测试代码
- 测试使用代码
package main
import (
"context"
"database/sql"
"log"
"reflect"
"项目名/tutorial"
_ "embed"
_ "github.com/mattn/go-sqlite3"
)
//go:embed schema.sql
var ddl string
func run() error {
ctx := context.Background()
db, err := sql.Open("sqlite3", ":memory:")
if err != nil {
return err
}
// create tables
if _, err := db.ExecContext(ctx, ddl); err != nil {
return err
}
queries := tutorial.New(db)
// list all authors
authors, err := queries.ListAuthors(ctx)
if err != nil {
return err
}
log.Println(authors)
// create an author
insertedAuthor, err := queries.CreateAuthor(ctx, tutorial.CreateAuthorParams{
Name: "Brian Kernighan",
Bio: sql.NullString{String: "Co-author of The C Programming Language and The Go Programming Language", Valid: true},
})
if err != nil {
return err
}
log.Println(insertedAuthor)
// get the author we just inserted
fetchedAuthor, err := queries.GetAuthor(ctx, insertedAuthor.ID)
if err != nil {
return err
}
// prints true
log.Println(reflect.DeepEqual(insertedAuthor, fetchedAuthor))
return nil
}
func main() {
if err := run(); err != nil {
log.Fatal(err)
}
}
批量生成
- 一次生成多张表模型代码,修改
sqlc.yaml
文件,将表sql和操作sql设置为文件目录即可。实例如下,生成方式不变,控制台执行:sqlc generate
version: "2"
sql:
# 数据库类型
- engine: "sqlite"
# 表结构
#schema: "sql/user.sql"
schema: "./sql/schema/"
# 操作sql语句
#queries: "sql/user-query.sql"
queries: "./sql/queries/"
gen:
go:
package: "dbsq"
out: "dbsq"
总结
- sqlc可生成简单增删改查,但不能生成分页查询,查询和修改也没有动态参数,用起来有点小难受,没有java的mybatis-generator工具强大,也可能个人知识能力有限。
- golang可编译的特性,大大降低资源占用,缩减安装包大小,但代码写起来有点别扭,特别是异常处理的方式,还有些语法解析隐藏的小bug,做些个人工具还不错。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。