前言
通过下图 The TIOBE Programming Community 的统计可以看到 Go
的发展如火如荼,于是我也迈进了 gophers
大军之中。
在 GitHub 搜索 Go
语言的 orm
框架。可以看到 gorm
的 star
远超其他同类框架。因此我们跟随大流,选用 gorm 框架。
依赖安装
依赖
这边使用的是 gen 完成表结构体的生成。
gen
是字节无恒实验室之前发布的一个 gorm
相关的开源工具 。其主要功能有:
- ⚡️ 自动同步库表,省去繁琐复制
- 代码一键生成,专注业务逻辑
- 字段类型安全,执行 SQL 也安全
- 查询优雅返回,完美兼容 GORM
其他相关资料可以从 无恒实验室联合GORM推出安全好用的ORM框架-GEN 或者 README 了解。
安装
在终端进入项目根目录,使用下面命令安装 gen
:
go get -u gorm.io/gen
表结构体生成
编写生成工具
在项目中找个合适的位置,创建一个文件 tools.go
,然后将下面代码填入文件内。
import (
"gorm.io/gen"
"gorm.io/gorm"
"strings"
)
func GenerateTableStruct(db *gorm.DB) {
//根据配置实例化 gen
g := gen.NewGenerator(gen.Config{
//文件生成路径
ModelPkgPath: "./dal/model",
//是否需要索引
FieldWithIndexTag: true,
//是否需要类型
FieldWithTypeTag: true,
//还有一些配置,不过我觉得暂时不需要。如果有兴趣,可以直接点进 config 查看...
})
//使用数据库的实例
g.UseDB(db)
//模型结构体的命名规则
g.WithModelNameStrategy(func(tableName string) (modelName string) {
if strings.HasPrefix(tableName, "tbl") {
return firstUpper(tableName[3:])
}
if strings.HasPrefix(tableName, "table") {
return firstUpper(tableName[5:])
}
return firstUpper(tableName)
})
//模型文件的命名规则
g.WithFileNameStrategy(func(tableName string) (fileName string) {
if strings.HasPrefix(tableName, "tbl") {
return firstLower(tableName[3:])
}
if strings.HasPrefix(tableName, "table") {
return firstLower(tableName[5:])
}
return tableName
})
//数据类型映射
dataMap := map[string]func(detailType string) (dataType string){
"int": func(detailType string) (dataType string) {
//if strings.Contains(detailType, "unsigned") {
// return "uint64"
//}
return "int64"
},
"bigint": func(detailType string) (dataType string) {
//if strings.Contains(detailType, "unsigned") {
// return "uint64"
//}
return "int64"
},
}
//使用上面的类型映射
g.WithDataTypeMap(dataMap)
//生成数据库内所有表的结构体
g.GenerateAllTable()
//生成某张表的结构体
//g.GenerateModelAs("tblUser", "User")
//执行
g.Execute()
}
//字符串第一位改成小写
func firstLower(s string) string {
if s == "" {
return ""
}
return strings.ToLower(s[:1]) + s[1:]
}
//字符串第一位改成大写
func firstUpper(s string) string {
if s == "" {
return ""
}
return strings.ToUpper(s[:1]) + s[1:]
}
上面代码中只是我这边的配置,gen
的配置还有很多,有兴趣的话,可以看官方文档或者直接点进代码去看。
使用工具生成结构体
工具的使用有很多种方式,选择一个适合你项目的方式就好,比如:
- 写个接口,使用接口触发结构体的生成
- 使用 cobra,生成个命令行工具,使用命令触发结构体的生成
如果觉得本篇文章不错,麻烦给个点赞、收藏、分享、在看四连!
公众号:干货输出机