golang从原始SQL查询文件生成常量工具插件qry的使用
golang从原始SQL查询文件生成常量工具插件qry的使用
关于
qry 是一个通用库,用于将原始数据库查询存储在.sql文件中,而不是代码中的字符串和常量,同时享受现代IDE的所有好处。它允许你在应用程序中轻松使用这些查询,并享受编译时常量的优势。
qry 递归加载指定文件夹中的所有.sql文件,根据预定义规则解析它们,并返回一个可重用的对象,实际上是一个带有一些语法糖的map[string]string
。单个文件中的多个查询使用标准SQL注释语法分隔:-- qry: QueryName
。QueryName
必须匹配[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)))
}
功能说明
- SQL文件解析:自动解析SQL文件中的查询,通过
-- qry: QueryName
注释分隔多个查询 - 常量生成:自动生成Go常量,便于在代码中使用
- 参数替换:支持使用
{param}
语法进行参数替换 - IN子句支持:通过
qry.In()
函数方便地生成IN子句占位符
这个工具特别适合需要管理大量SQL查询的项目,可以保持代码整洁,同时享受IDE的SQL语法高亮和自动完成功能。
更多关于golang从原始SQL查询文件生成常量工具插件qry的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于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
基本使用方法
- 首先创建一个包含 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 *;
- 使用 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)
}
优点
- 类型安全:SQL 查询作为常量使用,减少拼写错误
- 集中管理:所有 SQL 查询集中在一个文件中管理
- 易于维护:修改 SQL 只需更新查询文件并重新生成
- 文档友好:支持查询描述注释
替代方案
如果 qry 工具不能满足需求,也可以考虑以下替代方案:
- sqlc (https://github.com/sqlc-dev/sqlc) - 更强大的 SQL 转 Go 代码生成器
- 手动维护 SQL 常量
- 使用 ORM 如 GORM
qry 工具特别适合需要轻量级解决方案且希望保持对 SQL 完全控制的项目。