golang从原始SQL查询文件生成常量工具插件qry的使用

golang从原始SQL查询文件生成常量工具插件qry的使用

关于

qry 是一个通用库,用于将原始数据库查询存储在.sql文件中,而不是代码中的字符串和常量,同时享受现代IDE的所有好处。它允许你在应用程序中轻松使用这些查询,并享受编译时常量的优势。

qry 递归加载指定文件夹中的所有.sql文件,根据预定义规则解析它们,并返回一个可重用的对象,实际上是一个带有一些语法糖的map[string]string。单个文件中的多个查询使用标准SQL注释语法分隔:-- qry: QueryNameQueryName必须匹配[A-Za-z_]+

安装

go install github.com/HnH/qry/cmd/qry-gen@latest

使用示例

1. 准备SQL文件

创建 queries/one.sql 文件:

-- qry: InsertUser
INSERT INTO `users` (`name`) VALUES (?);

-- qry: GetUserById
SELECT * FROM `users` WHERE `user_id` = ?;

创建 queries/two.sql 文件:

-- qry: DeleteUsersByIds
DELETE FROM `users` WHERE `user_id` IN ({ids});

2. 生成常量

运行以下命令生成常量:

qry-gen -dir=./queries -pkg=/path/to/your/go/pkg

这将生成 /path/to/your/go/pkg/qry.go 文件,内容如下:

package pkg

const (
	// one.sql
	InsertUser  = "INSERT INTO `users` (`name`) VALUES (?);"
	GetUserById = "SELECT * FROM `users` WHERE `user_id` = ?;"

	// two.sql
	DeleteUsersByIds = "DELETE FROM `users` WHERE `user_id` IN ({ids});"
)

最佳实践是在源代码中添加go:generate指令:

//go:generate qry-gen -dir=./queries -pkg=/path/to/your/go/pkg

然后只需在每次构建前执行 go generate

3. 在项目中使用qry

func main() {
	/**
	 * 最直接的方式是使用生成的常量
	 */
	 
	// INSERT INTO `users` (`name`) VALUES (?);
	println(pkg.InsertUser)
	
	// DELETE FROM `users` WHERE `user_id` IN (?,?,?);
	println(qry.Query(pkg.DeleteUsersByIds).Replace("{ids}", qry.In(3)))
	
	/**
	 * 另一种方式是手动解析.sql文件
	 */
	if q, err := qry.Dir("/path/to/your/go/pkg/queries"); err != nil {
		log.Fatal(err)
	}

	// SELECT * FROM `users` WHERE `user_id` = ?;
	println(q["one.sql"]["GetUserById"])
  
	// DELETE FROM `users` WHERE `user_id` IN (?,?,?);
	println(q["two.sql"]["DeleteUsersByIds"].Replace("{ids}", qry.In(3)))
}

功能说明

  1. SQL文件解析:自动解析SQL文件中的查询,通过-- qry: QueryName注释分隔多个查询
  2. 常量生成:自动生成Go常量,便于在代码中使用
  3. 参数替换:支持使用{param}语法进行参数替换
  4. IN子句支持:通过qry.In()函数方便地生成IN子句占位符

这个工具特别适合需要管理大量SQL查询的项目,可以保持代码整洁,同时享受IDE的SQL语法高亮和自动完成功能。


更多关于golang从原始SQL查询文件生成常量工具插件qry的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang从原始SQL查询文件生成常量工具插件qry的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用 qry 工具从原始 SQL 查询文件生成 Golang 常量

qry 是一个实用的 Golang 工具,它可以从 SQL 查询文件中提取查询语句并生成对应的 Go 常量代码,方便在项目中管理和使用 SQL 查询。

安装 qry 工具

go install github.com/albrow/qry@latest

基本使用方法

  1. 首先创建一个包含 SQL 查询的文件,例如 queries.sql
-- name: GetUserById
SELECT * FROM users WHERE id = $1;

-- name: GetUsersByStatus
SELECT * FROM users WHERE status = $1 ORDER BY created_at DESC;

-- name: CreateUser
INSERT INTO users (name, email, status) VALUES ($1, $2, $3) RETURNING *;
  1. 使用 qry 工具生成 Go 代码:
qry generate -f queries.sql -o queries.go

生成的代码示例

生成的 queries.go 文件内容类似如下:

// Code generated by qry; DO NOT EDIT.

package main

const (
	GetUserById = `SELECT * FROM users WHERE id = $1;`

	GetUsersByStatus = `SELECT * FROM users WHERE status = $1 ORDER BY created_at DESC;`

	CreateUser = `INSERT INTO users (name, email, status) VALUES ($1, $2, $3) RETURNING *;`
)

高级用法

自定义包名

qry generate -f queries.sql -o queries.go -p models

添加前缀

qry generate -f queries.sql -o queries.go --prefix SQL_

生成结果:

const (
	SQL_GetUserById = `SELECT * FROM users WHERE id = $1;`
	// ...
)

使用注释

在 SQL 文件中可以使用注释来描述查询:

-- name: GetUserById
-- desc: 根据ID获取用户信息
SELECT * FROM users WHERE id = $1;

生成的代码会包含注释:

// GetUserById 根据ID获取用户信息
const GetUserById = `SELECT * FROM users WHERE id = $1;`

在项目中使用

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/lib/pq"
)

func main() {
	db, err := sql.Open("postgres", "user=postgres dbname=test sslmode=disable")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 使用生成的查询常量
	row := db.QueryRow(GetUserById, 1)
	
	var user struct {
		ID     int
		Name   string
		Email  string
		Status string
	}
	err = row.Scan(&user.ID, &user.Name, &user.Email, &user.Status)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("User: %+v\n", user)
}

优点

  1. 类型安全:SQL 查询作为常量使用,减少拼写错误
  2. 集中管理:所有 SQL 查询集中在一个文件中管理
  3. 易于维护:修改 SQL 只需更新查询文件并重新生成
  4. 文档友好:支持查询描述注释

替代方案

如果 qry 工具不能满足需求,也可以考虑以下替代方案:

qry 工具特别适合需要轻量级解决方案且希望保持对 SQL 完全控制的项目。

回到顶部