sql-generator —— 结构化 SQL 生成器
sql-generator 可用 JSON 来轻松生成复杂的 SQL,从而大幅提高写 SQL 的效率。
项目作用
- 将 SQL 的编写逻辑
结构化
,像写文章大纲一样编写和阅读 SQL - 重复的 SQL 只需编写一次 ,SQL 变动时修改一处即可
- 可以针对某部分 SQL 进行传参和调试
- 查看 SQL 语句的引用树和替换过程,便于分析理解 SQL
应用场景
如果你要写一句复杂的 SQL,且 SQL 中很多代码是 相似 但又不相同的。那么推荐使用该工具,可以不用重复编写 SQL,更有利于修改、维护和理解。
尤其是在大数据分析场景下,经常会有编写复杂 SQL 的需求。
当然,你也完全可以把它当做一个 重复代码生成器
~
示例
需求:计算 id = 1 和 id = 2 的两位同学的身高差
SQL 大概是这样的:
select (s1.height - s2.height) as 身高差 from (select * from student where id = 1) s1, (select * from student where id = 2) s2
显然,上述 SQL 中学生表查询了 2 次,而且除了查询的 id 不同外,查询逻辑完全一致!
如果后面查询学生的逻辑发生修改,那么以上 2 个子查询都要同时修改,不利于维护。
而使用本工具,只需编写如下 JSON,就能自动生成完整的 SQL 了:
{ "main": "select @身高差() from (@学生表(id = 1)) s1, (@学生表(id = 2)) s2", "身高差": "(s1.height - s2.height) as 身高差", "学生表": "select * from student where id = #{id}" }
通过类似 函数调用 + 传参
的方式,我们无需重复编写 SQL,而且整个 SQL 的逻辑更清晰!
当然,以上只是一个示例,真实大数据离线分析的场景下,SQL 可比这复杂 N 倍!
如果感兴趣的话,欢迎往下看文档,还有更复杂的示例~
优势
- 支持在线编辑 JSON 和 SQL,支持代码高亮、语法校验、一键格式化、查找和替换、代码块折叠等,体验良好
- 支持一键生成 SQL
- 支持参数透传,比如 @a(xx = #{yy}),yy 变量可传递给 @a 公式
- 支持嵌套传参(将子查询作为参数),比如 @a(xx = @b(yy = 1))
- 不限制用户在 JSON 中编写的内容,因此该工具也可以作为重复代码生成器来使用
- 支持查看 SQL 语句的调用树和替换详情,便于分析引用关系
文档
可以把下面的代码放到生成器中试试,一下就明白如何使用啦~
{ "main": "必填, 代码从这里开始生成, 用 @规则名() 引用其他语句", "规则名": "可以编写任意 SQL 语句 @规则名2() @动态传参(a = 求给 ||| b = star)", "规则名2": { "sql": "用 #{参数名} 指定可被替换的值", "params": { "参数名": "在 params 中指定静态参数, 会优先被替换" } }, "动态传参": "#{a}鱼皮#{b}" }
补充说明
对象键
:定义 SQL 生成规则名称,main 表示入口 SQL,从该 SQL 语句开始生成。对象值
:定义具体生成规则。可以是 SQL 字符串或者对象。sql
:定义模板 SQL 语句,可以是任意字符串,比如一组字段、一段查询条件、一段计算逻辑、完整 SQL 等。params
:静态参数,解析器会优先将该变量替换到当前语句的 #{变量名} 中#{xxx}
:定义可被替换的变量,优先用当前层级 params 替换,否则由外层传递@xxx(yy = 1 ||| zz = #{变量})
:引用其他 SQL,可传参,参数可再用变量来表示,使用 |||(三个竖线)来分隔参数。
实现
- 使用和 JSON 相性最好的 JavaScript 来实现,编写一份逻辑 JS 文件,可同时应用于 browser 和 server 端。
- 功能比较轻量,因此选择优先在纯 browser 端实现。
- 前端使用
Vue3 + Vite + Ant Design Vue
开发界面,选用Monaco Editor
实现代码编辑、高亮、格式化等功能,使用TypeScript + ESLint
保证代码规范。
SQL 生成逻辑如下:
- JSON 字符串转对象
- 从入口开始,先替换 params 静态参数,得到当前层解析
- 对 @xxx 语法进行递归解析,递归解析时,优先替换静态参数,再替换外层传来的调用参数
- 得到最终 SQL
解析器原本采用正则非贪婪替换方式实现,但无法实现嵌套调用,比如 @a(xx = @b()),会被识别为 @a(xx = @b(),匹配到了最近的右括号。 因此针对括号嵌套的情况对子查询替换算法做了优化,已支持包含括号语句的嵌套调用。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
每日一博 | AOP 那点事儿
又是一个周末,刚给宝宝喂完牛奶,终于让她睡着了。所以现在我才能腾出手来,坐在电脑面前给大家写这篇文章。 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之。翻译过来就是“面向方面编程”,可我更倾向于翻译为“面向切面编程”。它听起有些的神秘,为什么呢?当你看完这篇文章的时候,就会知道,我们做的很重要的工作就是去写这个“切面” 。那么什么是“切面”呢? 没错!就是用一把刀来切一坨面。注意,相对于面而言,我们一定是横着来切它,这简称为“横切”。可以把一段代码想象成一坨面,同样也可以用一把刀来横切它,下面要做的就是如何去实现这把刀! 需要澄清的是,这个概念不是由Rod Johnson(老罗)提出的。其实很早以前就有了,目前最知名最强大的 Java 开源项目就是 AspectJ 了,然而它的前身是AspectWerkz(该项目已经在 2005 年停止更新),这才是 AOP 的老祖宗。老罗(一个头发秃得和我老爸有一拼的天才)写了一个叫做Spring 框架,从此一炮走红...
- 下一篇
开源语音助手 Mycroft 创始人离职
近日,Mycroft 现任首席执行官 Michael Lewis 在官网发布博客文章,宣布公司创始人 Joshua Montgomery 已辞职。 Mycroft 是一个使用自然语言用户界面的开源语音助手,它是以 1966 年科幻小说《严厉的月亮》中一个虚构的计算机命名。项目代码已托管至 GitHub,目前的 Stars 数量为 5.8k。 Joshua Montgomery 是 Mycroft 的创始人,他将 Mycroft 核心部分开源的原因就是要接受广大开发者的审核与监督,避免智能语音助手给用户带来隐私安全问题。Mycroft 除了研发语音助手软件,他们同时也在开发并销售内置了其软件的智能音响产品,并且所有硬件也同样采用开源解决方案。 Mycroft 现任首席执行官 Michael Lewis 在博客中表示: 现在是探索新目标的时候了,Mycroft 的所有人都希望他能继续取得成功。 Joshua Montgomery 同样发文表示: 在 Michael 的掌舵下,我清楚地看到公司正在走向成功。这使得我有了自由,可以花些时间来重新组织。这七年是漫长而紧张的七年。所以我将离开 My...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果