7 个版本

0.2.0 2023 年 12 月 12 日
0.1.5 2023 年 11 月 22 日

#604 in 模板引擎

Download history 11/week @ 2024-03-10 71/week @ 2024-03-24 6/week @ 2024-03-31

60 次每月下载

MIT/Apache

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