dao命令用于生成dao数据访问对象文件,以及model数据结构定义文件。推荐使用配置文件来管理生成规则。

使用方式

进入项目根目录执行 gf gen dao 即可。以下为命令行帮助信息。

$ gf gen dao -h 
USAGE
    gf gen dao [OPTION]

OPTION
    -/--path             directory path for generated files.
    -l, --link           database configuration, the same as the ORM configuration of GoFrame.
    -t, --tables         generate models only for given tables, multiple table names separated with ','
    -e, --tablesEx       generate models excluding given tables, multiple table names separated with ','
    -g, --group          specifying the configuration group name of database for generated ORM instance,
                         it's not necessary and the default value is "default"
    -p, --prefix         add prefix for all table of specified link/database tables.
    -r, --removePrefix   remove specified prefix of the table, multiple prefix separated with ','
    -m, --mod            module name for generated golang file imports.
    -j, --jsonCase       generated json tag case for model struct, cases are as follows:
                         | Case            | Example            |
                         |---------------- |--------------------|
                         | Camel           | AnyKindOfString    |
                         | CamelLower      | anyKindOfString    | default
                         | Snake           | any_kind_of_string |
                         | SnakeScreaming  | ANY_KIND_OF_STRING |
                         | SnakeFirstUpper | rgb_code_md5       |
                         | Kebab           | any-kind-of-string |
                         | KebabScreaming  | ANY-KIND-OF-STRING |
    -/--stdTime          use time.Time from stdlib instead of gtime.Time for generated time/date fields of tables.
    -/--gJsonSupport     use gJsonSupport to use *gjson.Json instead of string for generated json fields of tables.
    -/--modelFile        custom file name for storing generated model content.
    -/--tplDaoIndex      template content for Dao index files generating.
    -/--tplDaoInternal   template content for Dao internal files generating.
    -/--tplModelIndex    template content for Model index files generating.
    -/--tplModelStruct   template content for Model internal files generating.

CONFIGURATION SUPPORT
    Options are also supported by configuration file.
    It's suggested using configuration file instead of command line arguments making producing.
    The configuration node name is "gf.gen.dao", which also supports multiple databases, for example:
    [gfcli]
        [[gfcli.gen.dao]]
            link     = "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
            tables   = "order,products"
            jsonCase = "CamelLower"
        [[gfcli.gen.dao]]
            link   = "mysql:root:12345678@tcp(127.0.0.1:3306)/primary"
            path   = "./my-app"
            prefix = "primary_"
            tables = "user, userDetail"

EXAMPLES
    gf gen dao
    gf gen dao -l "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
    gf gen dao -path ./model -c config.yaml -g user-center -t user,user_detail,user_login
    gf gen dao -r user_

配置示例

[gfcli]
    [[gfcli.gen.dao]]
        link   = "mysql:root:12345678@tcp(127.0.0.1:3306)/order"
        group  = "order"
        prefix = "order_"
        tables = "" 
    [[gfcli.gen.dao]]
        link   = "mysql:root:12345678@tcp(127.0.0.1:3306)/user"
        group  = "user"
        prefix = "user_"
        tables = "user,userDetail,userScore"

参数说明

名称必须默认值含义示例
gfcli.gen.dao
dao代码生成配置项,可以有多个配置项构成数组,支持多个数据库生成。-
link
分为两部分,第一部分表示你连接的数据库类型mysql, postgresql等, 第二部分就是连接数据库的dsn信息。具体请参考 ORM使用配置 章节。
mysql:root:12345678@tcp(127.0.0.1:3306)/user
groupdefault在数据库配置中的数据库分组名称。只能配置一个名称。

default

order

user

tables
指定当前数据库中需要执行代码生成的数据表。如果为空,表示数据库的所有表都会生成。user, userDetail
tablesEx
指定当前数据库中需要排除代码生成的数据表。product, order
path./app生成daomodel文件的存储目录地址./app
modelFilemodel.go自定义生成的模型文件名称。entity.go
prefix
生成数据库对象及文件的前缀,以便区分不同数据库或者不同数据库中的相同表名,防止数据表同名覆盖。

order_

user_

removePrefix
删除数据表的指定前缀名称。gf_
jsonCaseCamelLower

指定model中生成的数据实体对象中json标签名称规则,参数不区分大小写。参数可选为:CamelCamelLowerSnakeSnakeScreamingSnakeFirstUpperKebabKebabScreaming。具体介绍请参考命名行帮助示例。


CamelLower
stdTime
当数据表字段类型为时间类型时,代码生成的属性类型使用标准库的time.Time而不是框架的*gtime.Time类型。1
gJsonSupport
当数据表字段类型为JSON类型时,代码生成的属性类型使用*gjson.Json类型。1
tplDaoIndexgen_dao_template_dao.go生成Dao代码文件模板内容。请查看代码源文件
tplDaoInternalgen_dao_template_dao.go生成Dao Internal代码文件模板内容。请查看代码源文件
tplModelIndexgen_dao_template_model.go生成Model代码文件模板内容。请查看代码源文件
tplModelStructgen_dao_template_model.go生成Model Struct代码模板内容。请查看代码源文件
mod
用于生成go文件的import计算,默认情况下会自动读取当前项目根目录下的go.mod获取。github.com/gogf/gf-demos


生成的代码结构示例:

其中:

  1. dao/internal 以及model/internal 下面的文件由工具生成,多次生成会被覆盖,因此不要手动修改。采用internal包名的目的是仅作为daomodel的内部包引用,不对外开放。
  2. dao 目录下的文件 可以做一些数据库的定制化操作,通过工具多次生成不会覆盖,但是更多建议用户在自己的service中实现。
  3. model目录下的文件,可以做自定义的一些数据结构定义,通过工具多次生成不会覆盖。



  • No labels

31 Comments


  1. gf-cli如果是低于此版本使用gf gen dao 生成的代码,更新到图片上的版本,出现生成的版本,需要同时删除dao下和dao/internal/下对应的文件,新版不是指针版本了。

    1. 去掉指针设计是因为对象访问安全的缘故,具体请参考章节:对象封装设计

      1. 但是去掉了指针给我带来了一点困扰,

        mo := dao.SysRoleMenu
        mo.Where(mo.Columns.RoleId+"=?", cs.Id).All()
        all, err := mo.All()

        这样写法就没法叠加where的条件了,应该如何解决.我试过mo := &dao.SysRoleMenu 可以解决,但是我不知道这样写是不是又用回了指针,正确的做法应该是怎样的.
        1. 同样的方法,应该是一样的

        2. 你呀!你的dao.SysRoleMenu相当于只是一个方法封装对象,你的各个model方法会返回一个新的链式操作对象,保存返回的对象用以后续的ORM操作。例如:

          // 带条件查询的返回结果
          allThatHasCondition, err := dao.SysRoleMenu.Where(mo.Columns.RoleId, cs.Id).All()
          // 不带条件查询的返回结果
          allThatHasNoCondition, err := dao.SysRoleMenu.All()
          1. 我又研究了一遍示例项目搞懂了,感谢解答.目前对全局变量有点懵懂,看来得加深理解.

  2. 反馈:
    生成的代码结构示例:

    下面的图片 无法打开

  3. 各位大佬。分表的场景下怎么合理使用gen代码生成。比如订单表每月生成一个,表名称类似于order_202001、order_202002、order_202003。

    1. 目前gen dao命令不支持识别分表,可以加个正则匹配匹配的配置项来做识别,欢迎提PR。

      1. 增加了正则支持,增加了分表支持

  4. 请问下 目前支持 mongoDB 么?支持的话有没有代码生成操作示例?

    1. 暂不支持,不过根据接口设计可以很方便支持的,感兴趣可以参与贡献社区模块来对接,驱动开发请参考:ORM接口开发-驱动开发

  5. 1.16下生成的dao似乎与1.15下不一样了吧?不会直接返回表结构相应的对象了?而是改成map返回了么?针对这块,有没有一个专门的介绍帖子?

    1. cli只是开发辅助工具,与框架组件本身关系不大。从cli v1.16版本开始简化了生成的代码内容,具体看下发布说明以及生成的代码。

      1. 从1.15过来,一开始对1.16还是很多不适应。调整了大量代码后,现在还是可以用了。不过,从开发效率上来说,还是比较喜欢1.15的那种风格。现在1.16这种风格,反倒比较像是使用PHP了。感觉这块把字段给弱化后,在编写代码时,为了要写一个预定义的字段,要写老长一段代码,我一般是这样:dao.xxx.Columns.Fieldxxx  要写4级才行。这块看看能不能给想办法简化下(或者是我还不会用^_^)。不然还不如直接写 fieldxxx方便。

        旧代码我现在都调整为了struct或structs。这样也可以用起来了。

  6. jsonCase 能不能直接使用数据库的字段名
  7. 不然重构业务的时候比较复杂

    1. 设置为空即可。

  8. 在使用go-zero框架时, 把它的数据库操作换成了dao, 方便了很多。 但是二者对比, 希望增加一个和go-zero一样的功能,即 mysql+redis 自动生成: 生成带redis cache或者不带redis cache的代码逻辑。

    gf gen dao -l mysqlxxxxxx -r redis:xxxxxx

    1. 缓存的逻辑由业务控制,使用Cache方法即可,使用简便,具体请查看章节:ORM链式操作-查询缓存

  9. 现在新版本的gf不支持model了吗?全换成dao的形式了吗?我用gf gen model命令发现现在已经不能生成新的model文件了。

    1. Ray

      我的是:

      GF Version:  v1.16.0
        Build Time:  2021-06-03 20:43:58 可以生成model,是不是配置连接数据库不对

      1. 我的也是这个版本,数据库配置也是正常的但是就是不能生成model文件,我用-h命令发现type值里面没有了model这个值

        1. Ray

          toml配置正确的话,直接运行

          gf gen dao

          不加参数,看能不能成功把数据库里面已存在的表单生成model,生成不了的话那就是配置文件不对,看下提示信息。

  10. gf gen dao -l 后面参数,mysql密码中如果有带感叹号会报错,提示event not found

    1. 各种参数都写在config.toml配置文件里

      然后只执行 gf gen dao 命令

  11. 第一次生成表a, 第二次生成表b,

    然后model目录下的model.go文件里,

    表a的字段就被覆盖了.    只剩下表b的了.

    随着需求的变动,表是不断新增的   ,所以正确使用方式是,

    自动生成在model目录的model.go文件中,然后再剪切到model目录的internal目录中?

    1. Ray

      不会覆盖的,除非你数据库的表a字段发生了变化;

      你只新增表b, “gf gen dao”之后,只会在model里面新增表b;

      model是和你数据库里面表结构保持一致的;

      1. 知道原因了  gfcli-gen的配置  我每次只写一张表,  导致的 

        不过我还是感觉  不同的表,存放在不同的结构体中  更合理

        我现在是生成在model中 然后再剪切到其他地方,

        因为我这个项目 5个数据库,几百张表,model.go文件会变的很多行.

  12. 最新版的gf,gen dao生成的数据表实体都放在model.go这一个文件中了吗

    1. 看着像,我自动生成,也只有一个model.go,internal没有了。