AI 快讯Sqlsure 开源:给 AI 生成的 SQL 加一道确定性护栏
实战教程

Sqlsure 开源:给 AI 生成的 SQL 加一道确定性护栏

2026-07-12T02:04:25.419Z
Sqlsure 开源:给 AI 生成的 SQL 加一道确定性护栏

开发者 Tejus Arora 把 SQL 语义检查从概率交给了确定性引擎。Sqlsure 用规则化的静态分析拦住大模型生成 SQL 时最爱犯的那几类致命错误,思路简单,但击中痛点。

一件小工具,戳中了 AI 写 SQL 的老毛病

7 月 11 日,开发者 Tejus Arora 在 GitHub 上开源了一个叫 Sqlsure 的项目,Show HN 上挂出来不到一天就冲上首页。定位很直接:给 AI 生成的 SQL 加一层"确定性语义检查"(deterministic semantic checks)。翻译成人话——大模型写的 SQL 你别急着丢进生产库跑,先让 Sqlsure 用一套确定性的规则把它体检一遍。

这事儿看着小,但凡在过去两年里用 Copilot、Cursor 或者 Claude Code 让模型写过复杂 SQL 的人,应该都被坑过:JOIN 条件漏了一个,WHERE 里少了个租户隔离字段,聚合函数忘了 GROUP BY,或者更隐蔽的——语法完全合法、explain 也能跑,但语义上就是错的。这类错误传统 linter 抓不到,单元测试也未必覆盖,而它一旦上线,后果就是脏数据、错账单、甚至跨租户数据泄漏。

Sqlsure 想解决的正是这一段:介于"能不能跑"和"跑出来对不对"之间的灰色地带。

Sqlsure 在 CI 流水线中拦截 AI 生成 SQL 的示意图

为什么"确定性"三个字是关键

现在 SQL 校验这块,主流做法要么是 LLM 自己 review(让另一个模型看一眼),要么是跑一遍再看结果。前者是概率游戏,后者对生产环境风险太大。Sqlsure 的路子是老派的:把常见的语义错误抽象成一组规则,做静态分析,输入 SQL、输出确定的 pass/fail 加错误定位。

这套逻辑的价值在于可复现。同一段 SQL 跑一百遍,Sqlsure 给出的判断永远一样。你可以把它塞进 CI,塞进 pre-commit,塞进 agent 的工具链——不用担心今天过了明天挂。相比之下,用 GPT 去 review GPT 写的 SQL,本质是让概率检查概率,出了问题你连复盘都没法复盘。

这也是最近半年 AI 工程化领域的一个明显趋势:在 agent 越来越自主的同时,工具链反而在往"确定性"上收。前段时间有一批项目在做 typed tool call 校验、结构化输出 schema 强约束,Sqlsure 是同一股风向下的产物——LLM 负责生成,确定性工具负责兜底

它到底在查什么

从 README 和示例来看,Sqlsure 目前覆盖的检查项大致分几类,我按重要性排一下:

1. Schema 一致性

最基础也最有用的一层。给 Sqlsure 喂一份 schema(DDL 或者从数据库里抽出来),它会检查 SQL 里引用的表名、列名、类型是不是真的存在、能不能对上。大模型经常干的事:幻觉出一个不存在的字段名,或者把 user_id 写成 userId,跑一半才报错。这类问题静态分析一秒钟就能抓。

2. JOIN 语义

这是 AI 最容易翻车的地方。Sqlsure 会检查 JOIN 的条件是否合理——比如两个表通过明显的外键关系连接,但 ON 条件里用错了字段;或者出现了笛卡尔积却没有明确的 CROSS JOIN 声明。经验丰富的 DBA 一眼能看出来的问题,模型经常视而不见。

3. 聚合与分组

SELECT 里出现了非聚合列却没进 GROUP BY,这种错在 MySQL 老版本会静默通过,在 Postgres 会直接报错,在 AI 生成的代码里出现频率高得离谱。Sqlsure 把这类语义规则硬编码进去,比数据库自己报错更早、更清晰。

4. 租户/权限字段检查(这个是亮点)

可以配置一组"必须出现在 WHERE 里"的字段,比如 tenant_idorg_id。这直接对应 SaaS 场景下最要命的一类 bug——多租户数据串了。让模型自己记得加这个字段?靠不住。让 Sqlsure 强制检查,缺了就 fail,才是正经工程做法。

5. 危险操作检测

没有 WHERE 的 UPDATE/DELETE、全表扫描的高危查询、隐式类型转换等等。这一块跟传统 SQL linter 有重叠,但结合前面几项做联合判断,能过滤掉大量误报。

用起来什么样

典型用法是把它挂在 agent 生成 SQL 之后、执行之前的那一步。伪代码大概是这样:

from sqlsure import Checker

checker = Checker(schema="./schema.sql", rules="./sqlsure.yaml")

sql = llm.generate(prompt)  # 让模型写 SQL
result = checker.check(sql)

if not result.ok:
    # 把错误反馈回模型,让它重写
    sql = llm.regenerate(prompt, feedback=result.errors)
else:
    db.execute(sql)

配置文件里可以声明业务规则:

required_predicates:
  - table: orders
    columns: [tenant_id]
  - table: users
    columns: [org_id]

forbidden:
  - unbounded_delete
  - unbounded_update
  - cross_join_implicit

这套接口的设计意图很清楚:做 agent 的"编译器"。LLM 相当于写代码的人,Sqlsure 是那个不容商量的类型检查器。检查失败就把结构化的错误信息喂回去让模型重写,形成一个自纠正的循环。这比让模型自我 review 靠谱得多,因为反馈本身是确定的、可解释的。

Sqlsure 与 LLM 组成的自纠正循环示意图

和现有方案比,位置在哪

市面上和 Sqlsure 有点像的东西不少,但都不完全重合:

  • sqlfluff、sqlglot:老牌 SQL 静态分析,强在语法和格式。语义层面尤其是业务规则那块,基本不管。Sqlsure 更像是在 sqlglot 之上叠了一层"语义 + 业务规则"检查(README 里也确实提到用了 sqlglot 做 AST 解析)。
  • 数据库自身的 EXPLAIN / dry-run:能抓一部分问题,但要连数据库,成本高,而且部分错误(比如租户字段缺失)它根本不认为是错。
  • LLM-as-judge:让另一个模型 review,非确定性、慢、贵,前面已经吐槽过。
  • PromptQL、Vanna 之类的 text-to-SQL 框架:解决的是"怎么生成",Sqlsure 解决的是"生成完了怎么验",两者互补。

所以 Sqlsure 的定位有点像 SQL 版的 TypeScript 类型检查器——不阻止你写代码,但阻止你把明显有问题的代码 ship 出去。

局限和值得关注的点

泼两盆冷水:

第一,规则的覆盖度决定了它能抓多少 bug。目前项目还早,规则集主要覆盖英美主流范式,中文场景下常见的一些坑(比如中文列名、跨方言函数差异)可能还需要社区补。

第二,语义正确 ≠ 业务正确。Sqlsure 能保证 SQL 在 schema 层面合理、在结构上没有致命错误,但"这条查询是否真的回答了用户的问题"这一层,它管不了,也没打算管。这块还是得靠测试和人工 review。

第三,性能和多方言支持。Postgres、MySQL、SQLite 目前看是有的,ClickHouse、BigQuery、Snowflake 这些分析型仓库的方言支持还需要观察。做 AI 数据分析 agent 的团队尤其在意这一点。

第四,规则维护成本。这类项目的宿命是——一旦社区上量,规则库会指数级膨胀,如何管理规则优先级、如何避免误报,是所有静态分析工具最终都要面对的老问题。

一点判断

Sqlsure 不炫技,甚至有点"反 AI"——它做的是把大模型的自由度压缩回一个可控的盒子里。但这正是当下 AI 编码工程化最需要的东西。过去半年,我们看到太多 agent 项目在"更自主"这条路上狂奔,然后在生产环境翻车。像 Sqlsure 这样甘心做"护栏"的工具,反而是让 AI 生成代码真正落地到严肃场景的必要拼图。

如果你在做 text-to-SQL 类产品,或者在给内部数据平台接 AI 助手,这个项目值得马上 clone 下来看看。集成成本低,收益立竿见影——尤其是把"必须包含 tenant_id"这一条打开的那一刻,你会庆幸自己没等到出事之后再来加。

顺带一提,如果你在同时对比多个模型生成 SQL 的效果——比如 GPT、Claude、DeepSeek 谁写业务 SQL 更靠谱——OpenAI Hub 一个 Key 能直接调这些主流模型,国内直连、兼容 OpenAI 格式,配合 Sqlsure 做批量评测很方便。

参考来源

相关推荐

查看全部

联系我们

我们通常在工作时间快速响应

扫码添加微信

专属客服:Hub 助手

微信号: