根本原因是Sublime未找到psql,因其不自动安装PostgreSQL且无法自动识别路径,必须确保终端可运行psql --version,且该命令所在目录已加入Sublime启动时继承的PATH环境变量。

为什么 Ctrl+B 执行 SQL 总是卡住或报 command not found
根本原因就一个:Sublime 没找到 psql。它不会自动装 PostgreSQL,也不会从注册表或应用目录里“猜”路径。你得先确认终端里能直接跑 psql --version,再确保这个命令在 Sublime 启动时的环境 PATH 里也有效。
常见陷阱:
- macOS 上用 Homebrew 装的
psql在/opt/homebrew/bin/psql,但 Sublime 可能继承的是 shell 的 PATH(比如 zsh),而 GUI 应用默认用的是系统 PATH——导致终端能运行,Ctrl+B 却找不到 - Windows 用户把
psql.exe放在C:\Program Files\PostgreSQL\16\bin\,但没把这个路径加进系统环境变量,或者加了却没重启 Sublime - 用 Docker 或 WSL 的用户,误以为本地有
psql就行——其实 Sublime 只调用宿主机命令,WSL 里的psql不可见
Build System 配置中必须显式指定 working_dir 和 encoding
默认 Build System 不设工作目录,psql -f 会按 Sublime 主进程的启动路径找文件,不是当前 .sql 文件所在目录。结果常报 could not open file,其实只是路径错了。
编码问题更隐蔽:PostgreSQL 默认用 UTF8,但 Windows 控制台可能用 GBK,导致中文字段名乱码或插入失败。Build System 必须强制声明:
{
"cmd": ["psql", "-U", "postgres", "-d", "mydb", "-f", "$file"],
"working_dir": "$file_path",
"encoding": "utf-8",
"shell": true
}
注意:$file_path 是变量,不是字符串;shell 设为 true 才能在 Windows 上正确展开路径空格;Linux/macOS 可设 false 提升启动速度。
SQLTools 插件里 connections.json 的密码不能硬编码
SQLTools 要求连接配置写在 connections.json,但明文写 "password": "123456" 极不安全,且容易被 Git 提交泄露。更糟的是,PostgreSQL 的 psql 客户端本身就不支持命令行传密码(-W 会交互阻塞,Build System 不支持 stdin)。
可行方案只有三个:
- 用环境变量:配置
"password": "${env:PGPASSWORD}",然后在系统级或用户级 shell 配置里导出export PGPASSWORD=xxx(macOS/Linux)或setx PGPASSWORD "xxx"(Windows) - 用
.pgpass文件:按 PostgreSQL 规范放在~/.pgpass(macOS/Linux)或%APPDATA%\postgresql\pgpass.conf(Windows),格式为hostname:port:database:username:password,权限必须设为 600(否则psql拒绝读取) - 免密登录:在
pg_hba.conf里配trust或peer认证,仅限本地开发环境,生产绝对禁用
SQLTools 的字段补全失效,Ctrl+Space 没反应
这不是插件坏了,而是 LSP 服务根本没连上数据库。SQLTools 补全是靠语言服务器实时拉取表结构缓存,不是静态词典匹配。
检查点很具体:
-
SQLTools Language Server二进制是否下载成功?国内网络常超时,需手动下载对应平台版本(如sqltools-language-server-darwin-arm64),放进~/Library/Application Support/Sublime Text/Packages/SQLTools/bin/ -
connections.json里"driver"值必须是"postgres"(不是"postgresql"或"pg"),拼错就报Unsupported driver - 连接测试必须通过:右键 SQL 文件 →
SQLTools: Connect→ 看状态栏是否显示Connected to mydb;没连上,补全永远为空 - 首次连接后要等几秒——表结构同步是异步的,刚连上就按
Ctrl+Space会返回 “no suggestions”
最易忽略的是:SQLTools 对语法上下文敏感。SELECT 之后才提示字段,INSERT INTO 之后才提示表名,写 WHERE 时不会给你列名——它只在语义合法的位置触发补全,不像 IDE 那样“尽力猜测”。


















