gf gen dao 代码生成:流程与配置
在官方工程规范里,数据访问层代码是“有强烈规律、但不该手写”的:每个数据表要有一套结构体、一套 DAO 操作对象。gf gen dao 就是为此设计的核心命令,它按数据库表结构一次性生成 dao(数据访问对象)、do(数据转换模型)、entity(实体数据模型)三类代码,是框架工程规范落地最关键的 CLI 命令。
生成流程
- 先建好数据库表结构(字段注释写清楚,会进代码注释)。
- 在项目根目录的配置文件中配置
gfcli.gen.dao节点(脚手架通常放在hack/config.yaml,具体以你项目的官方模板为准)。 - 执行
gf gen dao(装了make可用make dao)。 - 重新编译项目,引用新生成的
dao/do/entity即可。
配置示例
gfcli:
gen:
dao:
- link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
tables: "user,user_detail" # 不填则生成库中所有表;v2.10 起支持 user_* 通配
removePrefix: "gf_" # 去掉表前缀,gf_user -> user
jsonCase: "CamelLower" # json 标签风格,默认 CamelLower
descriptionTag: true # 为字段生成 description 标签
stdTime: false # 默认时间字段用 *gtime.Time;true 则用 time.Time
gJsonSupport: true # JSON 字段生成 *gjson.Json
clear: false # true 会删除库里不存在的本地代码文件,慎用
常用参数速查:link(必填,数据库连接)、path(生成根目录,默认 internal)、tables/tablesEx(生成/排除的表)、prefix/removePrefix(前缀处理)、daoPath/doPath/entityPath(默认 dao、model/do、model/entity)、overwriteDao、noModelComment、typeMapping/fieldMapping(自定义类型映射,v2.5/v2.8 起支持)。更多参数以官方文档 goframe.org 为准。
生成物结构
执行后在 internal 下得到三类代码,官方对它们的“可改性”定义得很清楚:
| 目录 | 内容 | 可否手改 |
|---|---|---|
internal/dao | 每表一个 DAO 文件(含 internal/xxx 子目录的基础实现) | 外层可扩展 |
internal/model/do | 用于写入/条件的数据转换模型,用指针表达“未设置” | 不可改,重新生成覆盖 |
internal/model/entity | 与表一一对应的数据模型,只读查询常用 | 不可改,重新生成覆盖 |
package main
import (
_ "github.com/gogf/gf/contrib/drivers/mysql/v2" // 引入 MySQL 驱动
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
"goframe-demo/internal/dao"
"goframe-demo/internal/model/do"
"goframe-demo/internal/model/entity"
)
func main() {
var (
ctx = gctx.New()
)
// 写入:do 未赋值的指针字段不会被写入
_, err := dao.User.Ctx(ctx).Data(do.User{
Name: "john",
Age: 18,
}).Insert()
if err != nil {
panic(err)
}
// 查询:entity 承接查询结果
var user entity.User
err = dao.User.Ctx(ctx).Where("id", 1).Scan(&user)
if err != nil {
panic(err)
}
g.Dump(user)
}
DAO 的操作规范是:必须显式传入 ctx,通过 .Ctx(ctx) 或事务方法创建链式操作入口。
注意事项
do文件里使用指针类型表示“零值也要写入/未赋值就不参与”,这是官方推荐的设计。- 表结构变化后要重新执行
gf gen dao,不要手改entity/do,否则下次生成会被覆盖。 bool字段官方建议用bit(1)表示(tinyint(1)常被用作状态字段,语义容易混乱)。- Oracle 等依赖 CGO 的驱动需要自行编译 CLI 使用,官方默认不提供预编译版本。
小结
gf gen dao 的用法可以浓缩为:建表 → 配置 gfcli.gen.dao → 执行命令 → 引用生成物。它把“表结构 ↔ Go 代码”的同步变成一条命令的事,是后面所有 ORM 实战章节的地基。