Hello,我是Rocket
这是我参与更文挑战的第1天,活动详情查看:2021最后一次更文挑战
引言
- 新增了cmd工具,能支持生成读取mysql表生成Model、以及初始化表和表数据,源码就在项目里
- github传送门
- 喜欢的铁子们给点个star
1、make:model 支持读取mysql生成Model
代码在项目cmd/make-model.go
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、校验mysql链接
//2、检测文件夹是否存在,不存在就创建目录
//3、获取表信息
//4、循环执行生成model
我们做了一个比较有意思的处理;
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
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
//初始化表结构
//初始化默认数据
//具体代码请看源码
3、make:mysql 通过识别model生成mysql数据表
代码在项目cmd/make-mysql.go
1、在app/models/mysql.go 新增map用户存储实例化model的方法
var AutoMigratFunc = make(map[string]func() interface{})
2、参考app/models/test.go 主要靠init方法注册
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方法
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