Crates.io | sqlweld |
lib.rs | sqlweld |
version | 0.2.0 |
source | src |
created_at | 2023-11-21 22:27:15.511079 |
updated_at | 2023-12-12 01:25:24.515192 |
description | Create SQL files from templates and partials |
homepage | |
repository | https://github.com/dimfeld/sqlweld |
max_upload_size | |
id | 1044692 |
size | 244,814 |
sqlweld is a CLI tool designed to help manage large libraries of SQL statements that need to reuse the same SQL clauses.
sqlweld is designed to help solve these problems. Query files are Tera templates ending in the
.sql.tera
extension. The Tera syntax is similar, though not exactly the same as, Jinja.
Partials and macro files can end with .macros.sql.tera
or .partial.sql.tera
. The tool will render a .sql
file for each
non-partial template it finds.
sqlweld is also a Rust library and can used from a build.rs
file. By setting the print_rerun_if_changed
option,
it will automatically print the appropriate statements to rerun if the queries change.
Check the releases page for Homebrew, npm, curl, and other options. Of course, cargo install sqlweld
also works if you already have Rust installed.
Watch mode is not directly supported yet. Until it is, a tool such as watchexec can accomplish the same functionality.
watchexec --exts tera -- sqlweld -v
This example shows a simple use of the tool, with two queries that share a permissions check partial.
{% import "perm_check" as macros %}
SELECT * FROM some_objects
WHERE id=$[obj_id] AND team = $[team_id]
AND {{ macros::perm_check(table="'some_objects'") }}
{% 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'") }}
{%- 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 %}
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
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'
)