暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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 语句需要返回受影响的行数。



              文章转载自golang算法架构leetcode技术php,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论