检查工具配置

在使用脚手架工具之前,请检查本地的cli工具配置是否正确。默认的配置如下:

hack/config.yaml

  1. # CLI tool, only in development environment.
  2. # https://goframe.org/docs/cli
  3. gfcli:
  4. gen:
  5. dao:
  6. - link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
  7. descriptionTag: true
  8. docker:
  9. build: "-a amd64 -s linux -p temp -ew"
  10. tagPrefixes:
  11. - my.image.pub/my-app
  • 其中的dao部分配置即本次将要执行的命令的配置,其中的link为需要连接的数据库配置。descriptionTag表示为生成的entity代码文件增加字段描述到description标签中,如果数据表的entity对象被用到了接口api定义中,该标签则可作为参数描述。我们需要将此link配置改为我们的数据库连接地址。关于link配置项的详细介绍请参考章节 ORM使用配置-配置文件
  • 其中docker配置项是模板默认提供的配置,用于镜像编译。这里不做详解,感兴趣可以参考开发手册中开发工具相关章节。

执行代码生成

将数据表创建好后,我们在项目根目录下执行make dao自动生成对应的dao/do/entity文件。

  1. $ make dao
  2. generated: /Users/john/Temp/demo/internal/dao/user.go
  3. generated: /Users/john/Temp/demo/internal/dao/internal/user.go
  4. generated: /Users/john/Temp/demo/internal/model/do/user.go
  5. generated: /Users/john/Temp/demo/internal/model/entity/user.go
  6. done!

Step2 - 生成/dao/do/entity - 图1提示

make命令是在*nix系统下默认提供的指令,包括Linux/MacOS系统。如果是其他系统,例如Windows,默认不支持make命令,可以使用gf gen dao命令来替换。

goframe dao、do、entity

每张表将会生成三类Go文件:

  • dao:通过对象方式访问底层数据源,底层基于ORM组件实现。
  • do:数据转换模型,用于业务模型到数据模型的转换,由工具维护,用户不能修改。工具每次生成代码文件将会覆盖该目录。
  • entity:数据模型,由工具维护,用户不能修改。工具每次生成代码文件将会覆盖该目录。

更详细的介绍请参考章节 数据规范-gen dao

Step2 - 生成/dao/do/entity - 图3信息

由脚手架工具生成的代码中,都会带有顶部文件注释。如果文件注释中带有Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.的注释描述,那么表示该文件是由脚手架工具维护,每一次代码生成都会覆盖它。

dao

生成的dao文件有两个:

  • internal/dao/internal/user.go用于封装对数据表user的访问。该文件自动生成了一些数据结构和方法,简化对数据表的CURD操作。该文件每次生成都会覆盖,由开发工具自动维护,开发者无需关心。
  • internal/dao/user.go其实是对internal/dao/internal/user.go的进一步封装,用于供其他模块直接调用访问。该文件开发者可以随意修改,或者扩展dao的能力。

由于生成的internal/dao/internal/user.go文件完全由开发工具维护,那么我们只需关心internal/dao/user.go这个生成的源码文件,后续如果有需要可以在这个文件上做功能扩展。

示例源码:https://github.com/gogf/quick-demo/blob/main/internal/dao/user.go

internal/dao/user.go

  1. // =================================================================================
  2. // This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
  3. // =================================================================================
  4. package dao
  5. import (
  6. "demo/internal/dao/internal"
  7. )
  8. // internalUserDao is internal type for wrapping internal DAO implements.
  9. type internalUserDao = *internal.UserDao
  10. // userDao is the data access object for table user.
  11. // You can define custom methods on it to extend its functionality as you wish.
  12. type userDao struct {
  13. internalUserDao
  14. }
  15. var (
  16. // User is globally public accessible object for table user operations.
  17. User = userDao{
  18. internal.NewUserDao(),
  19. }
  20. )
  21. // Fill with you ideas below.

do

示例源码:https://github.com/gogf/quick-demo/blob/main/internal/model/do/user.go

internal/model/do/user.go

  1. // =================================================================================
  2. // Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
  3. // =================================================================================
  4. package do
  5. import (
  6. "github.com/gogf/gf/v2/frame/g"
  7. )
  8. // User is the golang structure of table user for DAO operations like Where/Data.
  9. type User struct {
  10. g.Meta `orm:"table:user, do:true"`
  11. Id interface{} // user id
  12. Name interface{} // user name
  13. Status interface{} // user status
  14. Age interface{} // user age
  15. }

关于do数据转换模型的使用,我们将在后续代码逻辑中做展示。

entity

示例源码:https://github.com/gogf/quick-demo/blob/main/internal/model/entity/user.go

internal/model/entity/user.go

  1. // =================================================================================
  2. // Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
  3. // =================================================================================
  4. package entity
  5. // User is the golang structure for table user.
  6. type User struct {
  7. Id uint `json:"id" orm:"id" description:"user id"` // user id
  8. Name string `json:"name" orm:"name" description:"user name"` // user name
  9. Status int `json:"status" orm:"status" description:"user status"` // user status
  10. Age uint `json:"age" orm:"age" description:"user age"` // user age
  11. }

可以看到该entity数据结构定义与数据表字段一一对应。

学习小结

可以感受到,使用GoFrame框架便捷的脚手架工具,我们从一些重复性的代码劳动中解放了出来,极大地提高了生产效率。针对数据库的操作将会变得非常简单。

在下一步,我们将设计CURD接口,一起看看在GoFrame框架中是如何快速定义接口的吧。