gin框架实践【Go-Gin_Api】20 工具篇

Hello,我是Rocket

这是我参与更文挑战的第1天,活动详情查看:2021最后一次更文挑战

引言

  • 新增了cmd工具,能支持生成读取mysql表生成Model、以及初始化表和表数据,源码就在项目里
  • github传送门
  • 喜欢的铁子们给点个star

1、make:model 支持读取mysql生成Model

代码在项目cmd/make-model.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
erlang复制代码package main

import (
"go-api/core"
"go-api/global"
"go-api/initialize"
"go-api/tool"

cmd "github.com/18211167516/go-cmd"
)

// versionCmd represents the version command
var structCmd = &cmd.Command{
Use: "make:model",
Short: "mysql转struct",
Long: `读取mysql的表结构转成Model文件`,
Run: func(Command *cmd.Command, args []string) {

table, _ := Command.Flags().GetString("table")
prefix, _ := Command.Flags().GetString("prefix")
file, _ := Command.Flags().GetString("file")
global.VP = core.Viper("../static/config/app.toml") //初始化配置
dsn := initialize.GetMasterDsn()

vip := core.Viper("./config/cmd.toml")
config := &tool.T2tConfig{
StructNameRtrims: vip.GetBool("StructNameRtrims"),//默认去除表名尾部s字符
UcFirstOnly: vip.GetBool("UcFirstOnly"),//
SavePath: vip.GetString("SavePath"),保存目录名
}
grom := tool.NewTable2Struct(config)
grom.
Table(table).
Prefix(prefix).
SavePath(file).
Dsn(dsn).
Run()
},
}

func init() {
cmd.RootCmd.AddCommand(structCmd)
structCmd.Flags().StringP("table", "t", "", "指定的表名,如果未指定则全部导出")
structCmd.Flags().StringP("prefix", "p", "", "表前缀")
structCmd.Flags().StringP("file", "f", "", "生成的目录")//如果不传默认会走配置文件SavePath
}

主要调用tool下table2struct.go

1
2
3
4
arduino复制代码//1、校验mysql链接
//2、检测文件夹是否存在,不存在就创建目录
//3、获取表信息
//4、循环执行生成model

我们做了一个比较有意思的处理;

1
2
3
4
5
6
7
8
9
c复制代码type SysRule struct {
ID int `gorm:"primary_key" json:"id" uri:"id"`
CreatedAt XTime `json:"created_at" gorm:"autoCreateTime"`
UpdatedAt XTime `json:"updated_at" gorm:"autoUpdateTime" `
DeletedAt gorm.DeletedAt `json:"deleted_at" gorm:"index"`
Role_name string `desc:"角色名称" json:"role_name" form:"role_name" gorm:"comment:角色名称;not null"`
Role_desc string `desc:"角色描述" json:"role_desc" form:"role_desc" gorm:"comment:角色描述;not null"`
Status *int `desc:"角色状态" json:"status" form:"status" gorm:"type:tinyint;size:1;default:1;comment:角色状态;"`
}

如果包含id,created_at,updated_at,deleted_at会合并成下边的model

1
2
3
4
5
6
c复制代码type SysRule struct {
Model
Role_name string `desc:"角色名称" json:"role_name" form:"role_name" gorm:"comment:角色名称;not null"`
Role_desc string `desc:"角色描述" json:"role_desc" form:"role_desc" gorm:"comment:角色描述;not null"`
Status *int `desc:"角色状态" json:"status" form:"status" gorm:"type:tinyint;size:1;default:1;comment:角色状态;"`
}

2、initdb 初始化表和表数据

代码在项目cmd/initdb.go

1
2
3
arduino复制代码//初始化表结构
//初始化默认数据
//具体代码请看源码

3、make:mysql 通过识别model生成mysql数据表

代码在项目cmd/make-mysql.go

1、在app/models/mysql.go 新增map用户存储实例化model的方法

1
go复制代码var AutoMigratFunc = make(map[string]func() interface{})

2、参考app/models/test.go 主要靠init方法注册

1
2
3
4
5
6
7
8
9
10
11
12
csharp复制代码
type Test struct {
Model
Name string `desc:"菜单name" json:"name" form:"name" gorm:"comment:名称;not null"`
Sort int `desc:"菜单排序值" json:"sort" form:"sort" gorm:"type:int;size:10;default:1;comment:排序标记;not null"`
}

func init() {
AutoMigratFunc["test"] = func() interface{} {
return Test{}
}
}

3、具体生成方法 cmd/initdata/init.go AutoMigrate方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
lua复制代码func AutoMigrate(db *gorm.DB, table string) {

if db.Migrator().HasTable(table) {
log.Printf("[make:mysql]-->数据表【%s】已存在\n", table)
os.Exit(0)
}

if value, ok := models.AutoMigratFunc[table]; !ok {
log.Printf("make:mysql-->数据表【%s】没有定义model层init方法初始化struct\n", table)
os.Exit(0)
} else {
if err := db.AutoMigrate(value()); err != nil {
log.Printf("[make:mysql]-->生成数据表【%s】失败,err: %v\n", table, err)
os.Exit(0)
}
}

log.Println("[make:mysql]-->生成数据表【%s】成功", table)

}

4、后续计划

计划支持支持生成controller、service、view

  1. 系列文章

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%