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 ','
    -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 |
    -/--tplDaoIndex      template content for Dao index files generating.
    -/--tplDaoInternal   template content for Dao internal files generating.
    -/--tplModelIndex    template content for Model index files generating.
    -/--tplModelInternal 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
mod
用于生成go文件的import计算,默认情况下会自动读取当前项目根目录下的go.mod获取。github.com/gogf/gf-demos
groupdefault在数据库配置中的数据库分组名称。

default

order

user

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

order_

user_

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

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


CamelLower


生成的代码结构示例:

其中:

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



  • No labels

9 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。