sqlc 类型安全 SQL 代码生成器
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/sqlc-type-safe-sql-code-generator 技能。
技能介绍
要解决什么问题
ORM 把 SQL 藏进字符串模板或运行时拼装里,类型错误往往要等到执行那一刻才暴露:改了一个列名,代码里某处拼接的查询静默失效,编译期毫无征兆,反射带来的运行时开销也无法消除。sqlc 的思路相反——把 SQL 当作唯一的事实来源,让数据库结构的变化在编译阶段就变成编译错误。
核心能力与工作流程
- 用纯 SQL 编写查询,放入
.sql文件,通过配置文件声明数据库连接与输出设置; - 运行
sqlc generate,sqlc 解析 SQL,对照真实表结构做校验; - 生成目标语言的类型化接口:查询函数、参数 struct、结果 struct 全部带完整类型标注;
- 生成的函数接受强类型参数、返回强类型结果,编译器在调用前就拦截类型不匹配的代码。
整个过程没有 ORM、没有反射、没有运行时拼查询。业务代码里调用的是一次普通的函数调用,传入什么类型、返回哪些字段,编译器一清二楚。
适用边界与注意点
- SQL 方言不是 100% 覆盖:窗口函数、CTE 等特性在各家数据库上的支持程度不同,复杂 SQL 可能解析失败或需要改写;
- 数据库 schema 变化后必须重新运行
sqlc generate并提交生成的代码,否则类型与实际库结构脱节; - Python 输出依赖上游的
sqlc-gen-python,其能力与其他语言生成器存在差异,遇到问题需查阅上游文档; - 适合查询模式相对固定、以手写 SQL 为核心的项目;若团队重度依赖 ORM 的动态查询能力,迁移成本需要单独评估。
使用场景
- Go 后端要把手写 SQL 放进 `.sql` 文件,用 sqlc generate 生成带参数与结果 struct 的类型化查询函数。
- TypeScript/Node 服务需要访问数据库,想用纯 SQL 定义查询并生成带类型接口,避免运行时拼 SQL 字段对不上。
- Python 服务不想引入 ORM,准备用 sqlc 生成类型化查询接口,在编译期发现参数或返回字段类型错误。
- Kotlin 项目维护固定 SQL 查询,schema 变更后重新运行 sqlc generate,并提交生成代码让编译器报错。
适合人员
- Go 后端工程师:需要为手写 SQL 生成编译期类型安全的数据访问层,减少 ORM 反射与运行时拼查询。
- TypeScript/Node 全栈工程师:希望数据库查询返回完整类型,避免字段名不一致到运行时才暴露。
- Python 服务开发者:不想引入 ORM,但仍要求 SQL 查询有类型化接口和参数约束。
- Kotlin 后端工程师:查询模式相对固定,想在 schema 变更后由编译器捕获类型不一致。