关于格式化 SQL
SQL 往往以一整行巨大的文本出现。来自 ORM 的日志,来自一份缺陷报告,来自某人的剪贴板。它跑得好好的,却完全没法读,而你要找的那一小段,就藏在中间某处。
粘贴进来,它就排好版回来了 — 每个子句一行,列在 SELECT 下缩进,JOIN 和它的 ON 条件对齐排列,让查询的结构一眼可见。
使用方法
- 把 SQL 粘贴到左边的框里 — 带配色的格式化结果会随着你输入出现在右边
- 需要的话调整缩进、关键字大小写和逗号位置 — 结果会立刻更新
- 复制它,或下载成 .sql 文件
- 切换到压成一行就能把它变回单行;你继续输入时也会保持这个模式
没有需要按下的「格式化」按钮。真正会改变结果的只有格式化和压成一行两个按钮,
它们决定你看到的是哪一种。
配色来自对查询的同一次解析
输出的着色,是把排版时用的同一个分词器再跑一遍成品文本得到的 — 关键字青色,字符串
黄色,数字橙色,注释灰色,标点粉色,而你自己的表名和列名保持原色,好让它们从周围的
SQL 中凸显出来。
这不只是好看的问题。因为对查询的同一次解析同时产生了排版和配色,两者绝不可能互相矛盾:
被涂成字符串的部分,正是格式化器当作字符串处理的部分。如果哪里的引号没有配对,颜色就会
一路蔓延,把位置指给你看 — 这通常比用眼睛找快得多。
复制和下载交出的是纯文本,绝不是带颜色的标记。
它特别小心的两件事
多数快速的 SQL 格式化工具靠正则表达式工作,而这两点正是那种做法崩掉的地方。
- 绝不窥探字符串和注释内部。 一条包含 WHERE note = 'from a, b' 的查询,字符串字面量里就有关键字、逗号和空格。基于正则的格式化会在那里断行,从而改变查询的含义。这个工具先把查询读成词元,所以字面量的内容会原封不动地出来 — 连空格都一样
- 标识符保持你写的大小写。 只有关键字会被转成大写或小写。在区分大小写的服务器上,userId 和 userid 是两个不同的列,而一个把它们「整理」掉的格式化工具,是为了好看而弄坏了查询
各种引用写法都能理解:用 '' 转义的 '字符串'、"带引号的标识符"、MySQL 的 反引号 、SQL Server 的 [方括号],以及 PostgreSQL 的 $$ 美元引用 $$。
可选项
- 缩进方式 — 4 个空格、2 个空格或制表符
- 关键字 — 大写、小写,或完全照你写的样子
- 逗号 — 放在行尾,或者按你们团队的习惯放在行首
压成一行
压缩会把查询收回成单独一行。只有在去掉空格会改变含义或产生新词元的地方才保留空格,所以结果在安全范围内已经尽可能短。
行注释会被丢弃,因为一旦全部挤到一行,-- 像这样的注释就会吞掉后面的一切。块注释则原样保留。
人们用它做什么
- 让 ORM 日志里的查询变得可读
- 在放进合并请求或迁移脚本之前整理 SQL
- 读懂别人写的长查询
- 把缺陷报告里的查询整理成能动手改的样子
- 为配置文件或 shell 命令把查询压到一行
- 提交前统一一整个 .sql 文件夹的写法风格
值得知道
- 你的查询只留在这个页面里,不会被送到任何地方。查询里有真实表名和列名时这很要紧
- 这个工具负责排版,不负责校验语法。有语法错误的查询会被尽力排版,而不是被拒绝
- 支持各方言的引用写法,但它不会在方言之间改写
- 非常大的查询也没问题 — 它只是在你自己的机器上做简单的工作
- 在所有浏览器中都能用,手机上也可以
相关工具
- JSON 格式化 — 对 JSON 做同样的事
- CSV 转 JSON — 转换查询返回的数据
- 批量查找替换 — 在一整个文件夹的 .sql 里改掉表名
- 文本差异比较 — 比较查询的两个版本
- 正则测试器 — 先把模式写好再拿去搜索