gf gen dao 代码生成:流程、产物与扩展
结论:gf gen dao 把“表结构”翻译成 Go 代码:按配置连接数据库,为每张表生成 entity(表结构体)、do(链式传参结构)、dao 与 dao/internal(数据访问封装,含字段常量),保证字段引用可编译期发现;产物集中在 internal/model 与 internal/dao,改表后重新生成,日常不手改。
一、流程
- 配置:hack/config.yaml 中配置 database 连接(link)、生成范围(tables/表前缀过滤)与输出目录(默认 internal/model、internal/dao)。
- 执行:项目根目录运行 gf gen dao(可用 -t 限定表、-h 查看参数,以官方文档为准)。
- 验证:生成后可编译检查,字段引用使用 Columns 常量保证重构安全。
二、产物一览
| 产物 | 位置 | 说明 |
|---|---|---|
| entity | internal/model/entity | 表结构体:字段与 orm/json 标签一一对应 |
| do | internal/model/do | 面向链式 Where/写入传参的结构 |
| dao | internal/dao + dao/internal | Ctx 入口、链式方法封装与字段常量 |
| Columns | dao 内部 | 字段名常量,如 dao.User.Columns().Name |
代码示例
// entity:internal/model/entity/user.go(示意)
type User struct {
g.Meta `orm:"table:user"`
Id int64 `json:"id" orm:"id"`
Name string `json:"name" orm:"name"`
Age int `json:"age" orm:"age"`
}
// 使用 dao:字段引用走常量,改列名可编译期发现
id, err := dao.User.Ctx(ctx).
Where(dao.User.Columns().Name, "tom").
Value("id")
常见追问 / 记忆点
- 追问:表结构变了怎么办?→ 改表后重新执行 gf gen dao,生成产物增量覆盖;手改过的生成文件会被覆盖,扩展应放 logic 或自定义模板。
- 追问:还能生成什么?→ gf gen service 可根据 dao/logic 反向生成 service 接口与实现骨架;模板可定制(以官方文档为准)。
- 记忆点:entity 照表、do 传参、dao 封装、Columns 常量——“表变就重跑,产物不手改”。