sql-generator

结构化 SQL 生成器
授权协议 Apache 2.0
开发语言 JavaScript TypeScript HTML/CSS
所属分类 数据库相关、 数据库管理工具
软件类型 开源软件
地区 不详
投 递 者 施旭东
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

sql-generator 可用 JSON 来轻松生成复杂的 SQL,从而大幅提高写 SQL 的效率。

项目作用

  1. 将 SQL 的编写逻辑 结构化 ,像写文章大纲一样编写和阅读 SQL
  2. 重复的 SQL 只需编写一次 ,SQL 变动时修改一处即可
  3. 可以针对某部分 SQL 进行传参和调试
  4. 查看 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 倍!

如果感兴趣的话,欢迎往下看文档,还有更复杂的示例~

优势

  1. 支持在线编辑 JSON 和 SQL,支持代码高亮、语法校验、一键格式化、查找和替换、代码块折叠等,体验良好
  2. 支持一键生成 SQL
  3. 支持参数透传,比如 @a(xx = #{yy}),yy 变量可传递给 @a 公式
  4. 支持嵌套传参(将子查询作为参数),比如 @a(xx = @b(yy = 1))
  5. 不限制用户在 JSON 中编写的内容,因此该工具也可以作为重复代码生成器来使用
  6. 支持查看 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 生成逻辑如下:

  1. JSON 字符串转对象
  2. 从入口开始,先替换 params 静态参数,得到当前层解析
  3. 对 @xxx 语法进行递归解析,递归解析时,优先替换静态参数,再替换外层传来的调用参数
  4. 得到最终 SQL

解析器原本采用正则非贪婪替换方式实现,但无法实现嵌套调用,比如 @a(xx = @b()),会被识别为 @a(xx = @b(),匹配到了最近的右括号。 因此针对括号嵌套的情况对子查询替换算法做了优化,已支持包含括号语句的嵌套调用。

  • Mybatis 概述 什么是MyBatis 一款优秀的持久层框架 支持定制化sql,存储过程一级高级映射 避免了几乎所有jdbc代码和手动设置参数以及获取结果集 可以使用简单的xml或注解来配置和映射原生类型,接口和java的pojo为数据库中的记录 本是apache的开源项目ibatis 2010年迁移到了google code 改名为mybatis 2013年迁移到github 持久化 持久化

  • 前言 接着上篇文章,一步步自定义需要生成的自定义方法以及在mapper.xml中生成自己想要的sql文件 开始改造 更改mapper方法命名风格 mybatis-generator生成的默认方法不是我想要的,我想要的风格如下: selectByPrimaryKey --> selectOne updateByPrimaryKeySelective --> update deleteByPrimar

  • 前言 在mybatis generator自定义sql基本和自定义命名风格的流程一样,当然也需要我们去写代码,完成整个扩展 扩展方法与sql 先修改org.mybatis.generator.api.IntrospectedTable.java类,在InternalAttribute增加自己需扩展的自定义方法枚举值,如想新增一个 selectList方法,定义一个ATTR_SELECT_LIST枚

  • 通过generator生成的sql,执行时报错,把sql copy出来到数据库手动执行,发现也报错 org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You

  • mybatis generator生成连接mysql与sqlserver所在的区别在于驱动和数据库URL不同   mybatis generator连接mysql的配置文件是: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

 相关资料
  • 本页描述了 Storm SQL 的设计和实现. 概览 SQL是一个很好使用但又复杂的标准. 包括 Drill,Hive,Phoenix 和 Spark 在内的几个项目都在其 SQL 层面上投入了大量资金. StormSQL 的主要设计目标之一是利用这些项目的现有资源. StormSQL 利用Apache Calcite 来实现 SQL 标准. StormSQL 专注于将 SQL 语句编译成Stor

  • generator 也就是生成器的英文拼写,它的主要作用是生成大批量的数据 方法一 (x for x in ['a', 'v']) 其实也就是把上一章迭代方法中的[]换成了(),那么返回的对象就不同了,前者是生成了一个list后者是生成了一个生成器。 其实跟js中的generator是一样的,打印出来这个生成器的内容只需要使用next()方法就OK了 l = ( x for x in ['1','

  • 生成器根据处理后的原始文件建立路由。 概要 hexo.extend.generator.register(name, function(locals){ }); 在函数中会传入一个 locals 参数,等同于 网站变量,请尽量利用此参数取得网站数据,避免直接存取资料库。 更新路由 hexo.extend.generator.register('test', function(locals){

  • 本文向大家介绍SQL(结构化查询语言)和T-SQL(Transact-SQL)之间的区别。,包括了SQL(结构化查询语言)和T-SQL(Transact-SQL)之间的区别。的使用技巧和注意事项,需要的朋友参考一下 的SQL SQL,结构化查询语言是一种非过程性语言,数据库引擎使用它来解释SQL查询以创建/修改/访问数据库元素。 T-SQL T-SQL Transact-SQL是SQL的过程扩展,

  • DB2 RazorSQL可生成SQL用于执行,,,和等操作。 选择特定列或使用语句选择全部。 得到以下结果: 通过使用,可以在表中插入记录。如下图所示: 生成代码结果如下: 通过使用,可以更新表中的记录。 生成代码结果如下: 通过使用,可以删除表中的记录。 生成代码结果如下:

  • 迭代器和生成器这两个概念总是很容易混淆,经过上节的学习我们知道迭代器是一个对象,那么本节首先要记住:生成器是一种能够中途停止,然后从停止的地方继续运行的函数。可以借助 yield 或 return 停止函数运行。 1. 慕课解释 通过 function* 来创建一个生成器函数,在调用一个生成器函数后,并不会立即执行函数中的代码,而是会返回一个迭代器对象,通过调用迭代器对象的 next() 方法,可