首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >sqlc源码分析

sqlc源码分析

作者头像
golangLeetcode
发布2022-08-02 19:01:32
发布2022-08-02 19:01:32
3390
举报

https://github.com/kyleconroy/sqlc

database/sql标准库提供的都是比较底层的接口。我们需要编写大量重复的代码。sqlc可以根据我们编写的 SQL 语句生成类型安全的、地道的 Go 接口代码,我们要做的只是调用这些方法。

安装:

代码语言:javascript
复制
$ go get github.com/kyleconroy/sqlc/cmd/sqlc

对应的数据库驱动:

代码语言:javascript
复制
$ go get github.com/go-sql-driver/mysql

编写 SQL 语句。在schema.sql文件中编写建表语句

query.sql文件中编写查询语句

代码语言:javascript
复制
-- name: GetAuthor :one
SELECT * FROM authors
WHERE id = $1 LIMIT 1;

sqlc支持 PostgreSQL 和 MySQL,不过对 MySQL 的支持是实验性的。很多语法是不支持的,比如in

sqlc额外只需要一个小小的配置文件sqlc.yaml

代码语言:javascript
复制
version: "1"
packages:
  - name: "db"
    path: "./db"
    queries: "./query.sql"
    schema: "./schema.sql"
  • version:版本;
  • packages
    • name:生成的包名;
    • path:生成文件的路径;
    • queries:查询 SQL 文件/路径;
    • schema:建表 SQL 文件/路径
代码语言:javascript
复制
sqlc generate 

生成对应代码

1,模型对象结构:// models.go

代码语言:javascript
复制
type Author struct {
  ID   int64
  Name string
  Bio  sql.NullString
}

2,操作接口:

代码语言:javascript
复制
// query.sql.go
func (q *Queries) CreateAuthor(ctx context.Context, arg CreateAuthorParams) (Author, error)
func (q *Queries) DeleteAuthor(ctx context.Context, id int64) error
func (q *Queries) GetAuthor(ctx context.Context, id int64) (Author, error)
func (q *Queries) ListAuthors(ctx context.Context) ([]Author, error)

其中Queriessqlc封装的一个结构。

3,调用

代码语言:javascript
复制
queries := db.New(db)
  authors, err := queries.ListAuthors(context.Background())

生成的代码在包db下(由packages.name选项指定),首先调用db.New()sql.Open()的返回值sql.DB作为参数传入,得到Queries对象。

代码生成

除了 SQL 语句本身,sqlc需要我们在编写 SQL 语句的时候通过注释的方式为生成的程序提供一些基本信息。语法为:

代码语言:javascript
复制
-- name: <name> <cmd>

name为生成的方法名,如上面的CreateAuthor/ListAuthors/GetAuthor/DeleteAuthor等,cmd可以有以下取值:

  • :one:表示 SQL 语句返回一个对象,生成的方法的返回值为(对象类型, error),对象类型可以从表名得出;
  • :many:表示 SQL 语句会返回多个对象,生成的方法的返回值为([]对象类型, error)
  • :exec:表示 SQL 语句不返回对象,只返回一个error
  • :execrows:表示 SQL 语句需要返回受影响的行数。

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

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码生成
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档