goland中sqlc报“command not found”是因ide未加载shell的path,需配置终端shell路径(macos)或确保sqlc.exe在系统path且从开始菜单启动(windows),并在ide终端执行which sqlc验证。

GoLand 本身不内置 sqlc 支持,但能通过 External Tools + Run Configuration 实现「右键 SQL 文件 → 一键生成」的闭环,关键在于路径、工作目录和输出路径三者对齐。
sqlc 命令在 GoLand 里总报 “command not found”
这不是 GoLand 的 bug,而是 shell 环境与 IDE 启动环境不一致导致的。GoLand 默认不读取 ~/.zshrc 或 ~/.bash_profile 中的 $PATH,所以即使终端里能跑 sqlc generate,IDE 里也会失败。
- macOS:在 GoLand 的
Help → Edit Custom Properties...里添加:idea.terminal.shell.path=/bin/zsh(或你实际用的 shell) - Windows:确保
sqlc.exe所在目录已加入系统PATH,且 GoLand 是从开始菜单启动(而非命令行启动),否则继承不到新 PATH - 通用验证法:在 GoLand 的 Terminal 面板里执行
which sqlc,如果为空,说明环境变量没加载成功
External Tools 配置后生成代码不进 ./db 目录
常见现象是生成文件出现在项目根目录,或报错 failed to write file: open db/queries.sql.go: no such file or directory——本质是 sqlc.yaml 里 packages[0].path 和 External Tools 的 Working directory 没对齐。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
-
sqlc.yaml中必须明确写:path: "./db"(不能是db或./db/尾部斜杠) - GoLand External Tools 的
Working directory必须设为$ProjectFileDir$(即项目根目录),不是$FileDir$ - Command line 填:
sqlc generate,不要加-f或路径参数——sqlc 只认当前目录下的sqlc.yaml - 如果
./db目录不存在,sqlc 不会自动创建,需手动mkdir -p db
生成的代码在 GoLand 里标红、找不到类型
GoLand 显示 cannot find package "yourproject/db" 或结构体字段标红,通常不是 sqlc 问题,而是 Go Modules 路径未识别或生成目录未纳入索引。
- 确认
go.mod的module名和 import 路径一致,比如module example.com/myapp,那就要用import "example.com/myapp/db" - 生成目录
./db必须在go.mod同级,不能嵌套在internal/或cmd/下(否则 GoLand 无法 resolve) - 右键
db目录 →Mark Directory as → Sources Root,强制 GoLand 把它当 Go 包源码处理 - 如果用了
emit_interface: true,生成的Querier接口需要显式实现,别漏掉func (q *Queries) Queries() db.Querier { return q }这类桥接方法
想保存 .sql 文件就自动触发生成?别用 File Watchers
GoLand 的 File Watchers 对 .sql 文件支持极差:它无法可靠捕获 INSERT INTO ... RETURNING * 这类带分号嵌套的语句变更,且容易误触发(比如改注释也跑一次)。更稳的方式是绑定快捷键 + 手动触发。
- External Tools 配置好后,在
Settings → Keymap里给它分配快捷键(如Ctrl+Shift+G) - 日常开发中,写完
query.sql后按快捷键,比等自动触发更可控 - 真要自动化,建议用
git commit前的 pre-commit hook 调用sqlc generate并检查 diff,避免手误漏生成
最易被忽略的一点:sqlc 生成的 db.go 里有 var db *sql.DB 全局变量,但 GoLand 不会帮你初始化它;你得在 main.go 或 init() 里调用 sql.Open("pgx", connStr) 并赋值给 db,否则运行时 panic —— 这个环节完全游离于 sqlc 工作流之外,却决定整个包能否跑起来。










