SQL Extension | SQL 语法拓展,目标是打造 "易读易写 方便维护" 的 sql 脚本
sqlx的Python项目详细描述
sqlx
SQL Extension
一种扩展 sql 的语言,目标是打造 "易读易写 方便维护" 的 sql 脚本
语法简介
1. 通过 define
定义变量,可在脚本中反复引用
示例:
definefield_nameageSELECT{field_name}fromstudentsWHERE{field_name}>10;SELECT{field_name}fromteachersWHERE{field_name}>10;
编译生成 sql 为:
SELECTagefromstudentsWHEREage>10;SELECTagefromteachersWHEREage>10;
2. 通过 block
定义脚本片段,并反复引用
示例:
-- ! 定义片段blockgood_students(score)(SELECT*FROMstudentsWHEREscore>{score})ASgood_studentsendblockSELECTnameFROM{good_students(80)};SELECTcount(*)FROM{good_students(80)};
编译生成 sql 为:
SELECTnameFROM(SELECT*FROMstudentsWHEREscore>80)ASgood_students;SELECTcount(*)FROM(SELECT*FROMstudentsWHEREscore>80)ASgood_students;
3. 循环
通过 for
批量循环生成脚本(暂不支持循环嵌套)
示例1:
{%fornintable1,table2,table3%}SELECT*FROM{n};{%endfor%}
编译生成 sql 为:
SELECT*FROMtable1;SELECT*FROMtable2;SELECT*FROMtable3;
示例2:
{%forn|mintable1|id,table2|name,table3|age%}SELECT{m}FROM{n};{%endfor%}
编译生成 sql 为:
SELECTidFROMtable1;SELECTnameFROMtable2;SELECTageFROMtable3;
4. 判断
通过 if
生成逻辑分支脚本(暂不支持 if 嵌套)
示例1:
definea8{%if$a>4%}SELECT*FROMtable1;{%endif%}
编译生成 sql 为:
SELECT*FROMtable1;
示例2:
{%fornintable1,table2,table3%}{%if$n==table1%}SELECTid,nameFROM{n};{%else%}SELECT*FROM{n};{%endif%}{%endfor%}
编译生成 sql 为:
SELECTid,nameFROMtable1;SELECT*FROMtable2;SELECT*FROMtable3;
更多示例可参考 demo.sqlx
5. 生成 {
}
字符
如果你需要在生成的 sql 内容中包含 {
}
这样的字符,不能直接在 sqlx 中写 {
或 }
,因为这样会被认为是变量的引用标记
你需要在这些字符前加上一个转义符(默认是\
),如 \{
\}
这样即可
示例:
defineccddSELECT*FROMtable1WHEREname='aa\{bb\}{cc}'
编译生成 sql 为:
SELECT*FROMtable1WHEREname='aa{bb}dd'
6. 使用 import
导入模块
通过 import 可以引入现有的 sqlx 脚本文件作,但只能导入其中的 define 和 block
如果在当前脚本有重复同名变量或 block,会被覆盖以当前脚本为准
示例:
-- mod.sqlxdefinecolumenamedefinecolume2scoreblockgood_students(score)(SELECT*FROMstudentsWHEREscore>{score})ASgood_studentsendblock
importmoddefinecolume2ageSELECT{colume}fromteachersWHERE{colume2}>10;SELECTnameFROM{good_students(60)};SELECTcount(*)FROM{good_students(80)};
编译生成 sql 为:
SELECTnamefromteachersWHEREage>10;SELECTnameFROM(SELECT*FROMstudentsWHEREscore>60)ASgood_students;SELECTcount(*)FROM(SELECT*FROMstudentsWHEREscore>80)ASgood_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
方法
importsqlxmy_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
语法
- 项目
标签: