sqlx
SQL Extension
一种扩展 sql 的语言,目标是打造 "易读易写 方便维护" 的 sql 脚本
语法简介
1. 通过 define 定义变量,可在脚本中反复引用
示例:
define field_name age
SELECT {field_name} from students WHERE {field_name} > 10;
SELECT {field_name} from teachers WHERE {field_name} > 10;
编译生成 sql 为:
SELECT age from students WHERE age > 10;
SELECT age from teachers WHERE age > 10;
2. 通过 block 定义脚本片段,并反复引用
示例:
-- ! 定义片段
block good_students(score)
(
SELECT
*
FROM
students
WHERE
score > {score}
) AS good_students
endblock
SELECT name FROM {good_students(80)};
SELECT count(*) FROM {good_students(80)};
编译生成 sql 为:
SELECT name FROM
(
SELECT
*
FROM
students
WHERE
score > 80
) AS good_students
;
SELECT count(*) FROM
(
SELECT
*
FROM
students
WHERE
score > 80
) AS good_students
;
3. 循环
通过 for 批量循环生成脚本(暂不支持循环嵌套)
示例1:
{% for n in table1,table2,table3 %}
SELECT * FROM {n};
{% endfor %}
编译生成 sql 为:
SELECT * FROM table1;
SELECT * FROM table2;
SELECT * FROM table3;
示例2:
{% for n|m in table1|id,table2|name,table3|age %}
SELECT {m} FROM {n};
{% endfor %}
编译生成 sql 为:
SELECT id FROM table1;
SELECT name FROM table2;
SELECT age FROM table3;
4. 判断
通过 if 生成逻辑分支脚本(暂不支持 if 嵌套)
示例1:
define a 8
{% if $a > 4 %}
SELECT * FROM table1;
{% endif %}
编译生成 sql 为:
SELECT * FROM table1;
示例2:
{% for n in table1,table2,table3 %}
{% if $n == table1 %}
SELECT id, name FROM {n};
{% else%}
SELECT * FROM {n};
{% endif %}
{% endfor %}
编译生成 sql 为:
SELECT id, name FROM table1;
SELECT * FROM table2;
SELECT * FROM table3;
更多示例可参考 demo.sqlx
5. 生成 { } 字符
如果你需要在生成的 sql 内容中包含 { } 这样的字符,不能直接在 sqlx 中写 { 或 },因为这样会被认为是变量的引用标记
你需要在这些字符前加上一个转义符(默认是\),如 \{ \} 这样即可
示例:
define cc dd
SELECT * FROM table1 WHERE name = 'aa\{bb\}{cc}'
编译生成 sql 为:
SELECT * FROM table1 WHERE name = 'aa{bb}dd'
6. 使用 import 导入模块
通过 import 可以引入现有的 sqlx 脚本文件作,但只能导入其中的 define 和 block
如果在当前脚本有重复同名变量或 block,会被覆盖以当前脚本为准
示例:
-- mod.sqlx
define colume name
define colume2 score
block good_students(score)
(
SELECT
*
FROM
students
WHERE
score > {score}
) AS good_students
endblock
import mod
define colume2 age
SELECT {colume} from teachers WHERE {colume2} > 10;
SELECT name FROM {good_students(60)};
SELECT count(*) FROM {good_students(80)};
编译生成 sql 为:
SELECT name from teachers WHERE age > 10;
SELECT name FROM
(
SELECT
*
FROM
students
WHERE
score > 60
) AS good_students
;
SELECT count(*) FROM
(
SELECT
*
FROM
students
WHERE
score > 80
) AS good_students
;
使用方法
Windows 64位系统,直接下载 sqlx.exe 放置于 .sqlx 脚本文件 同目录下
双击 sqlx.exe 即可在 dist 目录中生成对应 sql 文件
其他系统平台,通过 Python3 安装使用
如果你的系统无法运行 sqlx.exe,可以先安装 Python3,然后使用 pip 命令一键安装
pip install sqlx
使用 sqlx 命令行工具
- 安装后直接执行
sqlx命令,可一键编译当前目录下的所有.sqlx 脚本文件
$ ls
test1.sqlx test2.sqlx
$ sqlx
dist/test1.sql built
dist/test2.sql built
Finish!
$ ls dist
test1.sql test2.sql
sqlx命令后跟随目录路径参数,可编译指定路径下的所有脚本
$ ls test
test3.sqlx test4.sqlx
$ sqlx ./test/
test/dist/test3.sql built
test/dist/test4.sql built
Finish!
$ ls test/dist
test3.sql test4.sql
sqlx命令后跟随文件路径参数,可编译指定的单个脚本
$ sqlx ./test/test3.sqlx
test/dist/test3.sql built
Finish!
$ ls test/dist
test3.sql
在 Python3 程序中使用 sqlx.build 方法
import sqlx
my_script = """
{% for n in table1,table2,table3 %}
{% if $n == table1 %}
SELECT id, name FROM {n};
{% else %}
SELECT * FROM {n};
{% endif %}
{% endfor %}
"""
sql = sqlx.build(my_script, pretty=True)
print(sql)
版本更新说明
v0.1.1
第一个可用版本发布
- 支持
escape(默认\) - 自动复制编译的
sql进剪切板 - import sqlx 脚本功能
v0.1.0
第一个可用版本发布
- 支持
define语法 - 支持
block语法 - 支持
for语法 - 支持
if语法
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
sqlx-0.1.1.tar.gz
(34.3 kB
view details)
File details
Details for the file sqlx-0.1.1.tar.gz.
File metadata
- Download URL: sqlx-0.1.1.tar.gz
- Upload date:
- Size: 34.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc2df817f54faaecaa209e830d51ffe2cfc81bb354ccbd2bfeefede060ea72c9
|
|
| MD5 |
7c2f07cc20339fe46ee8b4640478dd8c
|
|
| BLAKE2b-256 |
da2cb4d66cf697a22fe90b0e2848fa1bdafe5c94b6fada0c63c85b70f9aa033a
|