7 个版本
0.2.0 | 2023 年 12 月 12 日 |
---|---|
0.1.5 | 2023 年 11 月 22 日 |
#604 in 模板引擎
60 次每月下载
55KB
797 行
sqlweld
sqlweld 是一个 CLI 工具,旨在帮助管理需要重复使用相同 SQL 子句的大型 SQL 语句库。
- 权限检查在查询之间通常非常相似,更新这些子句既繁琐又可能是安全漏洞的来源。
- 某些查询需要一些细微的变异,虽然它们可以在运行时格式化,但这会失去从静态定义查询带来的好处,尤其是在像 sqlx 这样的编译时检查工具中。
sqlweld 被设计用来解决这些问题。查询文件是以 .sql.tera
扩展名结尾的 Tera 模板。Tera 语法与 Jinja 类似,但并不完全相同。
部分和宏文件可以以 .macros.sql.tera
或 .partial.sql.tera
结尾。工具将为每个非部分模板生成一个 .sql
文件。
sqlweld 也是一个 Rust 库,可以从 build.rs
文件中使用。通过设置 print_rerun_if_changed
选项,它将自动打印适当的语句以重新运行,如果查询更改。
安装
查看 发布页面 以获取 Homebrew、npm、curl 等选项。当然,如果您已经安装了 Rust,则也可以使用 cargo install sqlweld
。
监控模式
监控模式目前尚不支持。在支持之前,可以使用如watchexec之类的工具来实现相同的功能。
watchexec --exts tera -- sqlweld -v
示例
此示例展示了工具的简单用法,其中包含两个共享权限检查部分的查询。
输入
get_some_objects.sql.tera
{% import "perm_check" as macros %}
SELECT * FROM some_objects
WHERE id=$[obj_id] AND team = $[team_id]
AND {{ macros::perm_check(table="'some_objects'") }}
update_some_objects.sql.tera
{% import "perm_check" as macros %}
UPDATE some_objects
SET value = 'a'
WHERE id=$[obj_id] AND team = $[team_id]
AND {{ macros::perm_check(action="'write'", table="'some_objects'") }}
perm_check.partial.sql.tera
{%- macro perm_check(user="$[user_id]", team="$[team_id]", action="'read'", table) -%}
EXISTS (
SELECT 1
FROM permissions
WHERE user_id = {{ user }}
AND team_id = {{ team }}
AND action = {{ action }}
AND object_type = {{table}}
)
{%- endmacro perm_check %}
输出
get_some_objects.sql
SELECT * FROM some_objects
WHERE id=$[obj_id] AND team = $[team_id]
AND EXISTS (
SELECT 1
FROM permissions
WHERE user_id = $[user_id]
AND team_id = $[team_id]
AND action = 'read'
AND object_type = 'some_objects'
)
update_some_objects.sql
UPDATE some_objects
SET value = 'a'
WHERE id=$[obj_id] AND team = $[team_id]
AND EXISTS (
SELECT 1
FROM permissions
WHERE user_id = $[user_id]
AND team_id = $[team_id]
AND action = 'write'
AND object_type = 'some_objects'
)
依赖项
~11-23MB
~338K SLoC