大家好,我是轩脉刃。
本文记录了使用gen项目实现了一个model自动生成命令的思路,其最终展示效果:https://github.com/gohade/hade/blob/main/docs/guide/model.md
我们写业务的时候和db接触是少不了的,那么要生成model也是少不了的,如何自动生成model,想着要给hade框架增加个这样的命令。
看了下网上的几个开源项目,最终聚焦在两个项目中:
https://github.com/go-gorm/gen
https://github.com/xxjwxc/gormt
gormt的gui是非常强大的,看文档都支持终端gui和windows的gui。但是gormt是一个工具,无法在另外一个项目中引入。
gen项目是gorm官方推出的,有jinzhu作者的参与。所以我尝试选择gen项目。(对的,原因就是这么肤浅...)
gen
gen其实不只是工具,它更像一个全新的orm封装。gen项目生成出来的文件有其实有两个部分,一个是model,就是db的表和对应的model,以xxx.gen.go 命名。而另一个部分是每个model对应一套gen函数,这套gen函数基本上是对orm的二次封装了。
当然这套函数是基于gorm来封装的,不过你可以完全脱离gorm来使用这套函数。
生成的方法示例如下:
g := gen.NewGenerator(gen.Config{
OutPath: "/Users/yejianfeng/Documents/workspace/gohade/hade/app/dal",
ModelPkgPath: "/Users/yejianfeng/Documents/workspace/gohade/hade/app/dal/model",
WithUnitTest: true,
FieldNullable: false,
FieldCoverable: true,
FieldWithIndexTag: false,
FieldWithTypeTag: false,
Mode: gen.WithDefaultQuery,
})
gormService := container.MustMake(contract.ORMKey).(contract.ORMService)
db, err := gormService.GetDB(orm.WithConfigPath("database.default"))
if err != nil {
return err
}
g.UseDB(db)
g.WithDataTypeMap(dataMap)
//g.WithJSONTagNameStrategy(func(c string) string { return "-" })
//g.ApplyBasic(model.Customer{})
//g.ApplyBasic(g.GenerateAllTab