关于 sql-lint
面向使用命名 SQL 查询目录的项目,提供轻量 lint 技能,用于检查基础格式与常见问题。内置零依赖 catalog-lint,也可选用针对 SQL 风格检查配置好的 sqlfluff。
主要功能
- 01检查重复或格式错误的查询名
- 02检测缺少分号和空查询体
- 03标记 SELECT * 与宽泛 LIKE
- 04提供零依赖 Node 脚本
- 05支持可选 sqlfluff 风格检查
适用场景
- 01在提交前检查 SQL 查询目录
- 02将基础检查加入 CI
- 03在迁移阶段执行 SQL 风格检查
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mizchi/ skills --skill sql-lint安装后在 Claude Code 中输入/sql-lint确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.sqlfluffREADME.mdscripts/catalog-lint.mjs详细介绍
SQL Lint
当项目有 SQL 目录(使用 -- name: X :type 注释或任何命名查询约定),并希望执行基本规范检查但不想采用重量级 SQL 检查器时,请使用此工具。
两层检查
此技能提供两种检查器,在成本和覆盖范围之间各有取舍。
第 1 层:catalog-lint(内置,无依赖)
scripts/catalog-lint.mjs 是一个不依赖任何依赖项的 Node 20+ 脚本。它可以检测:
- duplicate-name:两个查询具有相同的
-- name: X标头。某些代码生成器会静默覆盖;另一些则会出错。 - missing-semicolon:查询缺少结尾的
;。sqlc 会在构建时拒绝此类查询,而 catalog-lint 会在格式检查时发现它们。 - empty-body:标头后没有 SQL 正文。
- malformed-name:
-- name:行不符合name: X :type格式。 - select-star:
SELECT *(总是会过量获取数据)。 - double-wildcard-like:
LIKE '%...%'(存在全表扫描风险)。
运行(这是默认的第一步——先从这里开始,再考虑使用 sqlfluff):
# `scripts/` is relative to THIS skill's directory. From elsewhere, use the
# absolute path, e.g. node "$CLAUDE_SKILLS_DIR/sql-lint/scripts/catalog-lint.mjs".
node scripts/catalog-lint.mjs your-project/db/queries.sql
echo "exit=$?" # 0 = clean, 1 = findings — the exit code IS the pass/fail signal
检查通过时退出码为 0;发现问题时退出码为 1。输出格式为 file:line: [rule] message,可由编辑器的诊断边栏解析。注意:对于 select-star 和 double-wildcard-like,报告的行是查询的 -- name: 标头,而不是有问题的 SQL 行。
第 2 层:sqlfluff(可选,按需启用)
要进行全面的样式检查——关键字大小写、缩进、别名名称等——请使用 sqlfluff。此技能提供了针对 SQLite/D1 和 sqlc 目录调整过的 .sqlfluff:
uvx sqlfluff lint --config .sqlfluff your-project/db/queries.sql
uvx(来自 astral.sh/uv)会在临时虚拟环境中运行 sqlfluff,不会永久安装任何内容。如果缺少 uv,可改用 pip install sqlfluff 或 pipx install sqlfluff。
提供的配置禁用了几条 sqlfluff 规则:
AM04(SELECT *)由 catalog-lint 负责检查,且能提供更准确的上下文。CP02(列名大小写)对于obj.field_name这类 JSON 路径引用会产生太多误报。L009(末尾换行符)由 git 强制执行。
何时调用
- 每次提交涉及查询目录时(pre-commit / pre-push 钩子)。
- 每完成一个迁移里程碑,运行一次 sqlfluff,进行全面的样式检查。
宿主代码中的内联 SQL
此技能不会检查 MoonBit / Rust / Go / 等语言中的内联 SQL。此类场景适合使用 ast-grep,但需要针对每种语言提供 tree-sitter 支持。对于没有 tree-sitter 语法的宿主语言(例如 MoonBit),可以使用文本 grep 基线文件(.linters/inline-sql-baseline.json):统计每个文件中的 .prepare( 次数,并拒绝数量增加。
配套的 sql-security 技能介绍了同样的方法来防止 SQL 注入。
CI 集成
sql-lint:
node scripts/catalog-lint.mjs db/queries.sql
在 CI 中运行完整的 sqlfluff 检查时,应单独设置 sql-lint-style 步骤,这样轻量的 catalog-lint 就能快速失败。
引擎扩展性
catalog-lint.mjs 与引擎无关——这些规则检查 SQL 注释、分号和基本模式。要适配 MySQL / Postgres,请修改 .sqlfluff 中的 dialect = sqlite 行。
要求
scripts/catalog-lint.mjs需要 Node 20 或更高版本。- (可选)运行 sqlfluff 需要
uv/pipx/pip。
文件
scripts/catalog-lint.mjs— 无依赖的目录检查器。.sqlfluff— 按需启用的 sqlfluff 配置(SQLite 方言;用于其他引擎时请修改dialect = ...)。