sqlc源码分析
Posted golang算法架构leetcode技术php
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlc源码分析相关的知识,希望对你有一定的参考价值。
https://github.com/kyleconroy/sqlc
database/sql
标准库提供的都是比较底层的接口。我们需要编写大量重复的代码。sqlc
可以根据我们编写的 SQL 语句生成类型安全的、地道的 Go 接口代码,我们要做的只是调用这些方法。
安装:
$ go get github.com/kyleconroy/sqlc/cmd/sqlc
对应的数据库驱动:
$ go get github.com/go-sql-driver/mysql
编写 SQL 语句。在schema.sql
文件中编写建表语句
query.sql
文件中编写查询语句
-- name: GetAuthor :one
SELECT * FROM authors
WHERE id = $1 LIMIT 1;
sqlc
支持 PostgreSQL 和 MySQL,不过对 MySQL 的支持是实验性的。很多语法是不支持的,比如in
sqlc
额外只需要一个小小的配置文件sqlc.yaml
:
version: "1"
packages:
- name: "db"
path: "./db"
queries: "./query.sql"
schema: "./schema.sql"
version
:版本;packages
:name
:生成的包名;path
:生成文件的路径;queries
:查询 SQL 文件/路径;schema
:建表 SQL 文件/路径
sqlc generate
生成对应代码
1,模型对象结构:// models.go
type Author struct {
ID int64
Name string
Bio sql.NullString
}
2,操作接口:
// 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)
其中Queries
是sqlc
封装的一个结构。
3,调用
queries := db.New(db)
authors, err := queries.ListAuthors(context.Background())
生成的代码在包db
下(由packages.name
选项指定),首先调用db.New()
将sql.Open()
的返回值sql.DB
作为参数传入,得到Queries
对象。
代码生成
除了 SQL 语句本身,sqlc
需要我们在编写 SQL 语句的时候通过注释的方式为生成的程序提供一些基本信息。语法为:
-- name: <name> <cmd>
name
为生成的方法名,如上面的CreateAuthor/ListAuthors/GetAuthor/DeleteAuthor
等,cmd
可以有以下取值:
:one
:表示 SQL 语句返回一个对象,生成的方法的返回值为(对象类型, error)
,对象类型可以从表名得出;:many
:表示 SQL 语句会返回多个对象,生成的方法的返回值为([]对象类型, error)
;:exec
:表示 SQL 语句不返回对象,只返回一个error
;:execrows
:表示 SQL 语句需要返回受影响的行数。
以上是关于sqlc源码分析的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段
Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段
mysql jdbc源码分析片段 和 Tomcat's JDBC Pool
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段