Sublime Text需通过SQLTools插件配合外部格式化器(如pg_format)实现稳定SQL格式化;安装后配置formatter及formatter_path,用Cmd+Alt+F(macOS)或Ctrl+Alt+F(Win/Linux)触发,支持方言注释切换。

Sublime Text 本身不带 SQL 格式化功能,必须通过插件实现;最稳定、兼容性最好的方案是安装 SQLTools 配合外部格式化器(如 pg_format 或 sqlparse),而非依赖纯 Python 实现的轻量插件——后者在复杂 CTE、嵌套子查询或方言(如 HiveQL、T-SQL)上极易崩或错排。
安装 SQLTools 插件并启用格式化支持
SQLTools 是 Sublime 上唯一支持多数据库方言 + 可绑定外部 formatter 的成熟插件。它不自带格式化逻辑,但提供了清晰的配置入口和命令触发机制。
- 用
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS)打开命令面板,输入Package Control: Install Package回车,再搜索并安装SQLTools - 安装后重启 Sublime,确保状态栏右下角出现数据库连接图标(否则说明插件未激活)
- 该插件默认不开启格式化,需手动配置:打开
Preferences → Package Settings → SQLTools → Settings,在用户设置中添加"format_on_save": false和"formatter": "pg_format"(或其他已安装的 formatter 名)
配置外部 SQL 格式化器(以 pg_format 为例)
pg_format 是 Perl 编写的 PostgreSQL 官方推荐格式化器,对标准 SQL 兼容性极好,且能处理窗口函数、WITH RECURSIVE 等现代语法。Sublime 通过 shell 调用它,因此必须确保其可执行文件在系统 PATH 中。
- macOS:运行
brew install pgformatter,安装后执行which pg_format应返回类似/opt/homebrew/bin/pg_format - Ubuntu/Debian:执行
sudo apt install pgformatter,验证路径为/usr/bin/pg_format - Windows:下载 pgFormatter Windows 二进制包,解压后将含
pg_format.exe的目录加入系统环境变量PATH - 在
SQLTools设置中指定完整路径(尤其 Windows 用户):"formatter_path": "C:\\tools\\pgFormatter\\pg_format.exe",避免因 PATH 解析失败导致格式化命令静默失败
快速格式化当前 SQL 文件的正确操作流程
别用右键菜单里模糊的 “Format SQL” 选项——那是旧版插件残留项,大概率报错 command not found: sql_beautify。必须走 SQLTools 绑定的标准化路径。
- 确保当前文件语法高亮为
SQL(右下角显示 “SQL”,不是 “Plain Text”;若不是,点击右下角语言名 → 输入SQL→ 选中SQL) - 快捷键
Ctrl+Alt+F(Windows/Linux)或Cmd+Alt+F(macOS)直接调用格式化命令(前提是SQLTools设置中"formatter"已正确配置) - 若报错
Formatter 'pg_format' not found,检查formatter_path是否指向真实可执行文件,且该文件有执行权限(Linux/macOS 运行chmod +x /path/to/pg_format) - 格式化结果会原地替换全文,不创建新标签页——这是预期行为,无需担心覆盖
-- 示例:原始混乱 SQL(缩进错乱、关键字大小写混用) SELECT a.id,b.name FROM users a JOIN orders b ON a.id=b.user_id WHERE b.status='paid' ORDER BY b.created_at DESC LIMIT 10;
执行 Cmd+Alt+F 后自动变为:
SELECT a.id, b.name FROM users a JOIN orders b ON a.id = b.user_id WHERE b.status = 'paid' ORDER BY b.created_at DESC LIMIT 10;
注意:pg_format 默认按 PostgreSQL 方言解析,若写的是 MySQL 或 SQLite 语句,需在文件首行加注释 -- pg_format: mysql 或 -- pg_format: sqlite 切换方言,否则 GROUP_CONCAT 或 IFNULL 等函数可能被误判为语法错误。










