gen dao 命令是 CLI 中最频繁使用、也是框架设计的工程规范能否准确落地的关键命令。该命令用于生成 dao 数据访问对象、 do 数据转化模型及 entity 实例数据模型 Go 代码文件。由于该命令的参数、选项较多,我们推荐使用配置文件来管理生成规则。

数据规范-gen dao - 图1提示

关于框架项目工程规范介绍请查看 代码分层设计 章节。

使用方式

大部分场景下,进入项目根目录执行 gf gen dao 即可。以下为命令行帮助信息。

  1. $ gf gen dao -h
  2. USAGE
  3. gf gen dao [OPTION]
  4. OPTION
  5. -p, --path directory path for generated files
  6. -l, --link database configuration, the same as the ORM configuration of GoFrame
  7. -t, --tables generate models only for given tables, multiple table names separated with ','
  8. -x, --tablesEx generate models excluding given tables, multiple table names separated with ','
  9. -g, --group specifying the configuration group name of database for generated ORM instance,
  10. it's not necessary and the default value is "default"
  11. -f, --prefix add prefix for all table of specified link/database tables
  12. -r, --removePrefix remove specified prefix of the table, multiple prefix separated with ','
  13. -rf, --removeFieldPrefix remove specified prefix of the field, multiple prefix separated with ','
  14. -j, --jsonCase generated json tag case for model struct, cases are as follows:
  15. | Case | Example |
  16. |---------------- |--------------------|
  17. | Camel | AnyKindOfString |
  18. | CamelLower | anyKindOfString | default
  19. | Snake | any_kind_of_string |
  20. | SnakeScreaming | ANY_KIND_OF_STRING |
  21. | SnakeFirstUpper | rgb_code_md5 |
  22. | Kebab | any-kind-of-string |
  23. | KebabScreaming | ANY-KIND-OF-STRING |
  24. -i, --importPrefix custom import prefix for generated go files
  25. -d, --daoPath directory path for storing generated dao files under path
  26. -o, --doPath directory path for storing generated do files under path
  27. -e, --entityPath directory path for storing generated entity files under path
  28. -t1, --tplDaoIndexPath template file path for dao index file
  29. -t2, --tplDaoInternalPath template file path for dao internal file
  30. -t3, --tplDaoDoPath template file path for dao do file
  31. -t4, --tplDaoEntityPath template file path for dao entity file
  32. -s, --stdTime use time.Time from stdlib instead of gtime.Time for generated time/date fields of tables
  33. -w, --withTime add created time for auto produced go files
  34. -n, --gJsonSupport use gJsonSupport to use *gjson.Json instead of string for generated json fields of
  35. tables
  36. -v, --overwriteDao overwrite all dao files both inside/outside internal folder
  37. -c, --descriptionTag add comment to description tag for each field
  38. -k, --noJsonTag no json tag will be added for each field
  39. -m, --noModelComment no model comment will be added for each field
  40. -a, --clear delete all generated go files that do not exist in database
  41. -y, --typeMapping custom local type mapping for generated struct attributes relevant to fields of table
  42. -fm, --fieldMapping custom local type mapping for generated struct attributes relevant to specific fields of
  43. table
  44. -/--genItems
  45. -h, --help more information about this command
  46. EXAMPLE
  47. gf gen dao
  48. gf gen dao -l "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
  49. gf gen dao -p ./model -g user-center -t user,user_detail,user_login
  50. gf gen dao -r user_
  51. CONFIGURATION SUPPORT
  52. Options are also supported by configuration file.
  53. It's suggested using configuration file instead of command line arguments making producing.
  54. The configuration node name is "gfcli.gen.dao", which also supports multiple databases, for example(config.yaml):
  55. gfcli:
  56. gen:
  57. dao:
  58. - link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
  59. tables: "order,products"
  60. jsonCase: "CamelLower"
  61. - link: "mysql:root:12345678@tcp(127.0.0.1:3306)/primary"
  62. path: "./my-app"
  63. prefix: "primary_"
  64. tables: "user, userDetail"
  65. typeMapping:
  66. decimal:
  67. type: decimal.Decimal
  68. import: github.com/shopspring/decimal
  69. numeric:
  70. type: string
  71. fieldMapping:
  72. table_name.field_name:
  73. type: decimal.Decimal
  74. import: github.com/shopspring/decimal

数据规范-gen dao - 图2提示

如果使用框架推荐的项目工程脚手架,并且系统安装了 make 工具,也可以使用 make dao 快捷指令。

配置示例

文件配置示例:

hack/config.yaml

  1. gfcli:
  2. gen:
  3. dao:
  4. - link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
  5. tables: "order,products"
  6. jsonCase: "CamelLower"
  7. - link: "mysql:root:12345678@tcp(127.0.0.1:3306)/primary"
  8. path: "./my-app"
  9. prefix: "primary_"
  10. tables: "user, userDetail"
  11. # sqlite需要自行编译带sqlite驱动的gf,下载库代码后修改路径文件(gf\cmd\gf\internal\cmd\cmd_gen_dao.go)的import包,取消注释即可。sqlite驱动依赖了gcc
  12. - link: "sqlite:./file.db"

参数说明

名称默认值含义示例
gfcli.gen.daodao 代码生成配置项,可以有多个配置项构成数组,支持多个数据库生成。不同的数据库可以设置不同的生成规则,例如可以生成到不同的位置或者文件。-
link必须参数。分为两部分,第一部分表示你连接的数据库类型 mysql, postgresql 等, 第二部分就是连接数据库的 dsn 信息。具体请参考 ORM使用配置 章节。-
pathinternal生成 daomodel 文件的存储 目录 地址。./app
groupdefault在数据库配置中的数据库分组名称。只能配置一个名称。数据库在配置文件中的分组名称往往确定之后便不再修改。default
order
user
prefix生成数据库对象及文件的前缀,以便区分不同数据库或者不同数据库中的相同表名,防止数据表同名覆盖。order
user
removePrefix删除数据表的指定前缀名称。多个前缀以 , 号分隔。gf
removeFieldPrefix删除字段名称的指定前缀名称。多个前缀以 , 号分隔。f
tables指定当前数据库中需要执行代码生成的数据表。如果为空,表示数据库的所有表都会生成。user, user_detail
tablesExTables Excluding,指定当前数据库中需要排除代码生成的数据表。product, order
jsonCaseCamelLower指定 model 中生成的数据实体对象中 json 标签名称规则,参数不区分大小写。参数可选为: CamelCamelLowerSnakeSnakeScreamingSnakeFirstUpperKebabKebabScreaming。具体介绍请参考命名行帮助示例。Snake
stdTimefalse当数据表字段类型为时间类型时,代码生成的属性类型使用标准库的 time.Time 而不是框架的 gtime.Time 类型。true
withTimefalse为每个自动生成的代码文件增加生成时间注释
gJsonSupportfalse当数据表字段类型为 JSON 类型时,代码生成的属性类型使用 gjson.Json 类型。true
overwriteDaofalse每次生成 dao 代码时是否重新生成覆盖 dao/internal 目录外层的文件。注意 dao/internal 目录外层的文件可能由开发者自定义扩展了功能,覆盖可能会产生风险。true
importPrefix通过 go.mod 自动检测用于指定生成 Go 文件的 import 路径前缀。特别是针对于不是在项目根目录下使用 gen dao 命令,或者想要将代码文件生成到自定义的其他目录,这个时候配置该参数十分必要。github.com/gogf/gf
descriptionTagfalse用于指定是否为数据模型结构体属性增加 desription 的标签,内容为对应的数据表字段注释。true
noJsonTagfalse生成的数据模型中,字段不带有json标签
noModelCommentfalse用于指定是否关闭数据模型结构体属性的注释自动生成,内容为数据表对应字段的注释。true
clearfalse自动删除数据库中不存在对应数据表的本地 dao/do/entity 代码文件。请谨慎使用该参数!
daoPathdao代码生成的 DAO 文件存放目录
doPathmodel/do代码生成 DO 文件存放目录
entityPathmodel/entity代码生成的 Entity 文件存放目录
tplDaoIndexPath自定义 DAO Index 代码生成模板文件路径,使用该参数请参考源码
tplDaoInternalPath自定义 DAO Internal 代码生成模板文件路径,使用该参数请参考源码
tplDaoDoPath自定义 DO 代码生成模板文件路径,使用该参数请参考源码
tplDaoEntityPath自定义 Entity 代码生成模板文件路径,使用该参数请参考源码
typeMapping从版本v2.5开始支持。用于自定义数据表字段类型到生成的Go文件中对应属性类型映射。
fieldMapping从版本v2.8开始支持。用于自定义数据表具体字段到生成的Go文件中对应属性类型映射。

参数:typeMapping

参数typeMapping支持配置数据库字段类型对应的Go数据类型,默认值为:

  1. decimal:
  2. type: float64
  3. money:
  4. type: float64
  5. numeric:
  6. type: float64
  7. smallmoney:
  8. type: float64

该配置支持通过import配置项引入第三方包,例如:

  1. decimal:
  2. type: decimal.Decimal
  3. import: github.com/shopspring/decimal

参数:fieldMapping

参数fieldMapping提供细粒度的字段类型映射配置,支持配置指定数据库字段生成的Go数据类型。除了配置名称不一样外,配置内容与typeMapping一致。配置示例:

  1. paid_orders.amount:
  2. type: decimal.Decimal
  3. import: github.com/shopspring/decimal

示例中,paid_orders为表名称,amount为字段名称,type表示生成的Go代码中对应的数据类型名称,import表示生成的代码中需要引入第三方包。

使用示例

仓库地址: https://github.com/gogf/focus-single

数据规范-gen dao - 图3

1、以下 3 个目录的文件由 dao 命令生成:

路径说明详细介绍
/internal/dao数据操作对象通过对象方式访问底层数据源,底层基于 ORM 组件实现。往往需要结合 entitydo 共同使用。该目录下的文件开发者可扩展修改。
/internal/model/do数据转换模型数据转换模型用于业务模型到数据模型的转换,由工具维护,用户不能修改。工具每次生成代码文件将会覆盖该目录。关于 do 文件的介绍请参考:
- 数据模型与业务模型
- DAO-工程痛点及改进
- 利用指针属性和do对象实现灵活的修改接口
/internal/model/entity数据模型数据模型由工具维护,用户不能修改。工具每次生成代码文件将会覆盖该目录。

2、 model 中的模型分为两类: 数据模型业务模型

数据模型: 通过 CLI 工具自动生成 model/entity 目录文件,数据库的数据表都会生成到该目录下,这个目录下的文件对应的模型为数据模型。数据模型即与数据表一一对应的数据结构,开发者往往不需要去修改并且也不应该去修改,数据模型只有在数据表结构变更时通过 CLI 工具自动更新。数据模型由 CLI 工具生成及统一维护。

业务模型: 业务模型即是与业务相关的数据结构,按需定义,例如 service 的输入输出数据结构定义、内部的一些数据结构定义等。业务模型由开发者根据业务需要自行定义维护,定义到 model 目录下。

3、 dao 中的文件按照数据表名称进行命名,一个数据表一个文件及其一个对应的 DAO 对象。操作数据表即是通过 DAO 对象以及相关操作方法实现。 dao 操作采用规范化设计,必须传递 ctx 参数,并在生成的代码中必须通过 Ctx 或者 Transaction 方法创建对象来链式操作数据表。

数据规范-gen dao - 图4

注意事项

需要手动编译的数据库类型

gen dao 命令涉及到数据访问相关代码生成时,默认支持常用的若干类型数据库。如果需要 Oracle 数据库类型支持,需要开发者自己修改源码文件后自行本地手动编译生成 CLI 工具随后安装,因为这两个数据库的驱动需要 CGO 支持,无法预编译生成给大家直接使用。

数据规范-gen dao - 图5

关于 bool 类型对应的数据表字段

由于大部分数据库类型都没有 bool 类型的数据表字段类型, 我们推荐使用bit(1)来表示字段的bool类型,而非tinyint(1)或者int(1)。因为tinyint(1)/int(1)字段类型表示的范围是-127~127,通常可能会被用作状态字段类型。而bit(1)的类型范围为0/1,可以很好的表示bool类型的两个值false/true

例如,表字段:

数据规范-gen dao - 图6

生成的属性:

数据规范-gen dao - 图7