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使用配置 章节。 |
| |
group | 否 | default | 在数据库配置中的数据库分组名称。只能配置一个名称。 |
|
tables | 否 | 指定当前数据库中需要执行代码生成的数据表。如果为空,表示数据库的所有表都会生成。 | user, userDetail | |
tablesEx | 否 | 指定当前数据库中需要排除代码生成的数据表。 | product, order | |
path | 否 | ./app | 生成dao 和model 文件的存储目录地址 | ./app |
modelFile | 否 | model.go | 自定义生成的模型文件名称。 | entity.go |
prefix | 否 | 生成数据库对象及文件的前缀,以便区分不同数据库或者不同数据库中的相同表名,防止数据表同名覆盖。 |
| |
removePrefix | 否 | 删除数据表的指定前缀名称。 | gf_ | |
jsonCase | 否 | CamelLower | 指定 | CamelLower |
stdTime | 否 | 当数据表字段类型为时间类型时,代码生成的属性类型使用标准库的time.Time 而不是框架的*gtime.Time 类型。 | 1 | |
gJsonSupport | 否 | 当数据表字段类型为JSON 类型时,代码生成的属性类型使用*gjson.Json 类型。 | 1 | |
tplDaoIndex | 否 | gen_dao_template_dao.go | 生成Dao 代码文件模板内容。 | 请查看代码源文件 |
tplDaoInternal | 否 | gen_dao_template_dao.go | 生成Dao Internal 代码文件模板内容。 | 请查看代码源文件 |
tplModelIndex | 否 | gen_dao_template_model.go | 生成Model 代码文件模板内容。 | 请查看代码源文件 |
tplModelStruct | 否 | gen_dao_template_model.go | 生成Model Struct 代码模板内容。 | 请查看代码源文件 |
mod | 否 | 用于生成go 文件的import 计算,默认情况下会自动读取当前项目根目录下的go.mod 获取。 | github.com/gogf/gf-demos |
生成的代码结构示例:
其中:
dao/internal
以及model/internal
下面的文件由工具生成,多次生成会被覆盖,因此不要手动修改。采用internal
包名的目的是仅作为dao
或model
的内部包引用,不对外开放。dao
目录下的文件 可以做一些数据库的定制化操作,通过工具多次生成不会覆盖,但是更多建议用户在自己的service
中实现。model
目录下的文件,可以做自定义的一些数据结构定义,通过工具多次生成不会覆盖。
31 Comments
智刚
gf-cli如果是低于此版本使用gf gen dao 生成的代码,更新到图片上的版本,出现生成的版本,需要同时删除dao下和dao/internal/下对应的文件,新版不是指针版本了。
郭强
去掉指针设计是因为对象访问安全的缘故,具体请参考章节:对象封装设计
xushushun
但是去掉了指针给我带来了一点困扰,
张育铭
同样的方法,应该是一样的
郭强
你呀!你的
dao.SysRoleMenu
相当于只是一个方法封装对象,你的各个model
方法会返回一个新的链式操作对象,保存返回的对象用以后续的ORM
操作。例如:xushushun
我又研究了一遍示例项目搞懂了,感谢解答.目前对全局变量有点懵懂,看来得加深理解.
刘羽禅
反馈:
生成的代码结构示例:
下面的图片 无法打开
Chris Lee
各位大佬。分表的场景下怎么合理使用gen代码生成。比如订单表每月生成一个,表名称类似于order_202001、order_202002、order_202003。
郭强
目前
gen dao
命令不支持识别分表,可以加个正则匹配匹配的配置项来做识别,欢迎提PR。JackJun
增加了正则支持,增加了分表支持
aloha
请问下 目前支持 mongoDB 么?支持的话有没有代码生成操作示例?
郭强
暂不支持,不过根据接口设计可以很方便支持的,感兴趣可以参与贡献社区模块来对接,驱动开发请参考:ORM接口开发-驱动开发
朱华 Hunk
1.16下生成的dao似乎与1.15下不一样了吧?不会直接返回表结构相应的对象了?而是改成map返回了么?针对这块,有没有一个专门的介绍帖子?
郭强
cli
只是开发辅助工具,与框架组件本身关系不大。从cli v1.16
版本开始简化了生成的代码内容,具体看下发布说明以及生成的代码。朱华 Hunk
从1.15过来,一开始对1.16还是很多不适应。调整了大量代码后,现在还是可以用了。不过,从开发效率上来说,还是比较喜欢1.15的那种风格。现在1.16这种风格,反倒比较像是使用PHP了。感觉这块把字段给弱化后,在编写代码时,为了要写一个预定义的字段,要写老长一段代码,我一般是这样:dao.xxx.Columns.Fieldxxx 要写4级才行。这块看看能不能给想办法简化下(或者是我还不会用^_^)。不然还不如直接写 fieldxxx方便。
旧代码我现在都调整为了struct或structs。这样也可以用起来了。
赵会南
赵会南
不然重构业务的时候比较复杂
郭强
设置为空即可。
spikejim
在使用go-zero框架时, 把它的数据库操作换成了dao, 方便了很多。 但是二者对比, 希望增加一个和go-zero一样的功能,即 mysql+redis 自动生成: 生成带redis cache或者不带redis cache的代码逻辑。
gf gen dao -l mysqlxxxxxx -r redis:xxxxxx
郭强
缓存的逻辑由业务控制,使用
Cache
方法即可,使用简便,具体请查看章节:ORM链式操作-查询缓存yxl123458
现在新版本的gf不支持model了吗?全换成dao的形式了吗?我用gf gen model命令发现现在已经不能生成新的model文件了。
Ray
我的是:
GF Version: v1.16.0
Build Time: 2021-06-03 20:43:58 可以生成model,是不是配置连接数据库不对
yxl123458
我的也是这个版本,数据库配置也是正常的但是就是不能生成model文件,我用-h命令发现type值里面没有了model这个值
Ray
toml配置正确的话,直接运行
gf gen dao
不加参数,看能不能成功把数据库里面已存在的表单生成model,生成不了的话那就是配置文件不对,看下提示信息。
randol
gf gen dao -l 后面参数,mysql密码中如果有带感叹号会报错,提示event not found
刘羽禅
各种参数都写在
config.toml
配置文件里然后只执行
gf gen dao
命令刘羽禅
第一次生成表a, 第二次生成表b,
然后model目录下的model.go文件里,
表a的字段就被覆盖了. 只剩下表b的了.
随着需求的变动,表是不断新增的 ,所以正确使用方式是,
自动生成在model目录的model.go文件中,然后再剪切到model目录的internal目录中?
Ray
不会覆盖的,除非你数据库的表a字段发生了变化;
你只新增表b, “gf gen dao”之后,只会在model里面新增表b;
model是和你数据库里面表结构保持一致的;
刘羽禅
知道原因了
gfcli-gen
的配置 我每次只写一张表, 导致的不过我还是感觉 不同的表,存放在不同的结构体中 更合理
我现在是生成在model中 然后再剪切到其他地方,
因为我这个项目 5个数据库,几百张表,model.go文件会变的很多行.
LeeEcho
最新版的gf,gen dao生成的数据表实体都放在model.go这一个文件中了吗
173417897
看着像,我自动生成,也只有一个model.go,internal没有了。