SuperAPI AI 工具集

sqlc

数据与分析

查看项目

更新于 10-15 20:14

技能介绍

用途:Hive 使用 sqlc 从 SQL 查询生成类型安全的 Go 代码,生成文件提交到仓库,禁止手动编辑。

文件布局:internal/store/db/ 下包含 queries/(queries.sql 核心会话与消息查询、queries_hc.sql Honeycomb 查询)、migrations/(NNNN_name.up.sql 模式迁移,是 sqlc 的 schema 来源)、以及生成的 queries.sql.go、queries_hc.sql.go、models.go。仓库根目录的 sqlc.yaml 在 sql[0].queries 下列出两个查询文件。

运行代码生成:修改 .sql 查询文件或 sqlc.yaml 后执行 mise run generate(运行 sqlc generate 加 go-enum 生成),或直接运行 sqlc generate。生成的 *.sql.go 与 models.go 需与 SQL 变更一起提交。

添加查询:在对应 .sql 文件中写带注解的查询,注解 :one 返回单行、:many 返回切片、:exec 不返回行。运行 mise run generate 后,生成函数出现在 db 包下的 queries_hc.sql.go 或 queries.sql.go 中,通过 s.db.Queries().GetHCItem(ctx, id) 调用。

类型覆盖:当列存储领域枚举时,在 sqlc.yaml 添加 overrides,使生成的参数/返回值直接使用 Go 类型而非 string。领域类型须实现 driver.Valuer 和 sql.Scanner(或使用文本编组);go-enum 生成的类型通过 MarshalText/UnmarshalText 满足要求,SQLite 按文本处理。

Schema 来源:sqlc 从 internal/store/db/migrations/*.up.sql 推导 schema,新增迁移后运行 mise run generate 重新生成模型,models.go 总会被覆盖,不要在其中添加手写代码。

独立查询文件:HC 查询放在 queries_hc.sql 以缩小 diff 范围;新功能查询文件可在 sqlc.yaml 的 sql[0].queries 下列出,所有查询文件共享同一 gen.go 输出目录与包。

常见模式:可空/可选列使用 sql.NullString、sql.NullInt64 等,必要时在 sqlc.yaml 中用 nullable: true 覆盖;时间戳以 INTEGER NOT NULL(Unix 秒)存储,生成代码使用 int64,与 time.Time 的转换在 store 层而非生成代码中完成;事务方面,store 方法通过 s.db.Ctx(ctx) 调用查询,当上下文携带事务时加入环境事务,用 s.db.WithinTx(ctx, func(ctx context.Context, q *db.DB) error { ... }) 开启工作单元,嵌套调用加入外层事务,仅最外层提交或回滚。

限制:生成文件不可手动编辑;schema 以迁移文件为准;类型覆盖要求领域类型实现相应接口。其余细节暂未提供。