您现在的位置是:首页 >学无止境 >sqlc代码生成工具网站首页学无止境

sqlc代码生成工具

羽落风起 2024-06-17 10:18:00
简介sqlc代码生成工具

说明

sqlc是golang数据库代码自动生成工具,支持数据库支持mysql、sqlite、PostgreSQL,可通过配置快速生成golang代码。

分享

资料

安装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,做些个人工具还不错。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。