mode配置必须与调用方式严格匹配:withdefaultquery需配合query.use(db),withoutcontext要求调用不传ctx,withqueryinterface需手动实现或withctx包装;字段类型须用fieldtype统一映射,避免int8与int等类型不匹配导致运行时panic。

直接用 gen 生成代码就能拿到类型安全查询接口,但多数人卡在生成后调用 panic 或编译失败——根本原因是 Mode 配置和实际使用方式没对齐。
gen.Mode 必须和 query 调用方式严格匹配
Mode 不是开关列表,而是决定生成代码“契约风格”的核心配置。混用或错配会立刻暴露:编译报错、IDE 无提示、运行时 panic。
-
gen.WithDefaultQuery:生成query.User这类全局单例类型,但必须配合query.Use(db)初始化才能用,否则.Where()直接 panic “no db instance” -
gen.WithoutContext:生成的方法签名不含context.Context,如果你业务里所有 DAO 调用都传了ctx,就会报too many arguments -
gen.WithQueryInterface:生成UserDo接口类型,不能直接链式调用.Find(),得手动实现或用WithCtx包装 - 禁止组合
gen.WithoutContext | gen.WithDefaultQuery:前者要求方法无 ctx 参数,后者生成的Use()方法却带 ctx,签名冲突
字段类型映射错位会导致运行时 panic
MySQL 的 TINYINT(1) 默认映射为 int8,但 Go 字面量 1 是 int 类型,传给 q.Status.Eq(1) 就会触发类型不匹配 —— 编译过、运行崩。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 不推荐显式转类型:
q.Status.Eq(int8(1)),维护成本高 - 用
gen.FieldType("status", "int")统一映射为int,适配业务习惯 - 布尔字段优先用
gen.FieldType("is_active", "bool") + gen.FieldRelate("is_active", "Active"),避免uint8带来的判断歧义 -
DECIMAL建议统一映射为int64,单位转“分”,再加json:"amount,string"tag 防精度丢失
生成后 query.User.Where() 编译失败?检查三件事
query.User 不是变量,是结构体类型别名;真正可用的是 query.Use(db).User 返回的实例。常见错误都集中在这一步。
- 忘记
import "your_project/query",IDE 提示undefined: query - 在
init()或全局变量中调用query.Use(db),但db尚未初始化,导致 nil panic - 生成路径含
../query,但项目go.mod的module名不是your,Go 无法解析导入路径
最易被忽略的是:Mode 和调用方式的耦合是硬约束,不是可选配置;字段类型映射一旦生成就固化在代码里,改数据库 schema 不会自动同步到 Go 类型 —— 每次变更都要重新生成并校验。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










