gf gen dao 代码生成:流程与配置

在官方工程规范里,数据访问层代码是“有强烈规律、但不该手写”的:每个数据表要有一套结构体、一套 DAO 操作对象。gf gen dao 就是为此设计的核心命令,它按数据库表结构一次性生成 dao(数据访问对象)、do(数据转换模型)、entity(实体数据模型)三类代码,是框架工程规范落地最关键的 CLI 命令。

生成流程

  1. 先建好数据库表结构(字段注释写清楚,会进代码注释)。
  2. 在项目根目录的配置文件中配置 gfcli.gen.dao 节点(脚手架通常放在 hack/config.yaml,具体以你项目的官方模板为准)。
  3. 执行 gf gen dao(装了 make 可用 make dao)。
  4. 重新编译项目,引用新生成的 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(默认 daomodel/domodel/entity)、overwriteDaonoModelCommenttypeMapping/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 实战章节的地基。

笔记加载中…