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 命令行工具

  1. 安装后直接执行 sqlx 命令,可一键编译当前目录下的所有 .sqlx 脚本文件
$ ls
test1.sqlx    test2.sqlx

$ sqlx
dist/test1.sql built
dist/test2.sql built
Finish!

$ ls dist
test1.sql    test2.sql
  1. 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
  1. 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 语法

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java不兼容类型:MainActivity无法转换为LifecycleOwner   java安卓是一种更有效的读取大文本文件的方法   java导出LWJGL本地人与项目?(IntelliJ IDEA)   JDK更新后,JavaJShell不再在下一行打印输出   父类对象上的继承Java比较子属性   Java:有没有一个容器可以有效地结合HashMap和ArrayList?   安卓 Java对象指针   java在annotationdriven Spring MVC应用程序中实现大气   java 安卓源代码构建应用找不到安卓supportv4。罐子   文件系统上的抽象层和Java中的jar/zip   java在水平滚动视图中添加多个图像?   java如何从firebase实时数据库中获取字符串数组   WIndows 10工作站上的java未满足链接错误   java命令在终端中工作,但在使用过程中出现“无结束引号”错误。执行官