Restructure

重构
This commit is contained in:
谢小军
2019-09-30 18:25:22 +08:00
parent 7a555e91f5
commit ee2e02092a
18 changed files with 249 additions and 247 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -24,7 +24,7 @@ var rootCmd = &cobra.Command{
Long: `base on gorm tools for mysql database to golang struct`, Long: `base on gorm tools for mysql database to golang struct`,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
gtools.Execute() gtools.Execute()
//开始做事情 // Start doing things.开始做事情
}, },
} }
@@ -74,7 +74,7 @@ func initConfig() {
} }
} }
//MergeMysqlDbInfo 合并 // MergeMysqlDbInfo merge parm
func MergeMysqlDbInfo() { func MergeMysqlDbInfo() {
var tmp = config.GetMysqlDbInfo() var tmp = config.GetMysqlDbInfo()
if len(mysqlInfo.Database) > 0 { if len(mysqlInfo.Database) > 0 {

View File

@@ -2,7 +2,7 @@ package config
import "fmt" import "fmt"
//Config . // Config custom config struct
type Config struct { type Config struct {
CfgBase CfgBase
MySQLInfo MysqlDbInfo `toml:"mysql_info"` MySQLInfo MysqlDbInfo `toml:"mysql_info"`
@@ -12,26 +12,26 @@ type Config struct {
SingularTable bool `toml:"singular_table"` SingularTable bool `toml:"singular_table"`
} }
//MysqlDbInfo mysql 数据库信息 // MysqlDbInfo mysql database information. mysql 数据库信息
type MysqlDbInfo struct { type MysqlDbInfo struct {
Host string `validate:"required"` //地址 Host string `validate:"required"` // Host. 地址
Port int `validate:"required"` //端口号 Port int `validate:"required"` // Port 端口号
Username string `validate:"required"` //用户名 Username string `validate:"required"` // Username 用户名
Password string `validate:"required"` //密码 Password string `validate:"required"` // Password 密码
Database string `validate:"required"` //数据库名 Database string `validate:"required"` // Database 数据库名
} }
//SetMysqlDbInfo 更新mysql配置信息 // SetMysqlDbInfo Update MySQL configuration information
func SetMysqlDbInfo(info *MysqlDbInfo) { func SetMysqlDbInfo(info *MysqlDbInfo) {
_map.MySQLInfo = *info _map.MySQLInfo = *info
} }
//GetMysqlDbInfo 获取mysql配置信息 // GetMysqlDbInfo Get MySQL configuration information .获取mysql配置信息
func GetMysqlDbInfo() MysqlDbInfo { func GetMysqlDbInfo() MysqlDbInfo {
return _map.MySQLInfo return _map.MySQLInfo
} }
//GetMysqlConStr 获取mysql 连接字符串 // GetMysqlConStr Get MySQL connection string.获取mysql 连接字符串
func GetMysqlConStr() string { func GetMysqlConStr() string {
return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local",
_map.MySQLInfo.Username, _map.MySQLInfo.Username,
@@ -42,32 +42,32 @@ func GetMysqlConStr() string {
) )
} }
//SetOutDir 设置输出目录 // SetOutDir Setting Output Directory.设置输出目录
func SetOutDir(outDir string) { func SetOutDir(outDir string) {
_map.OutDir = outDir _map.OutDir = outDir
} }
//GetOutDir 获取输出目录 // GetOutDir Get Output Directory.获取输出目录
func GetOutDir() string { func GetOutDir() string {
return _map.OutDir return _map.OutDir
} }
//SetSingularTable 设置禁用表名复数 // SetSingularTable Set Disabled Table Name Plurals.设置禁用表名复数
func SetSingularTable(b bool) { func SetSingularTable(b bool) {
_map.SingularTable = b _map.SingularTable = b
} }
//GetSingularTable 获取禁用表名复数 // GetSingularTable Get Disabled Table Name Plurals.获取禁用表名复数
func GetSingularTable() bool { func GetSingularTable() bool {
return _map.SingularTable return _map.SingularTable
} }
//GetSimple 简单输出 // GetSimple simple output.简单输出
func GetSimple() bool { func GetSimple() bool {
return _map.Simple return _map.Simple
} }
//GetIsJSONTag json标记 // GetIsJSONTag json tag.json标记
func GetIsJSONTag() bool { func GetIsJSONTag() bool {
return _map.IsJSONTag return _map.IsJSONTag
} }

View File

@@ -9,13 +9,13 @@ import (
"github.com/BurntSushi/toml" "github.com/BurntSushi/toml"
) )
//CfgBase . // CfgBase base config struct
type CfgBase struct { type CfgBase struct {
SerialNumber string `json:"serial_number" toml:"serial_number"` //版本号 SerialNumber string `json:"serial_number" toml:"serial_number"` // version.版本号
ServiceName string `json:"service_name" toml:"service_name"` //service名字 ServiceName string `json:"service_name" toml:"service_name"` // service name .service名字
ServiceDisplayname string `json:"service_displayname" toml:"service_displayname"` //显示名 ServiceDisplayname string `json:"service_displayname" toml:"service_displayname"` // display name .显示名
SerciceDesc string `json:"sercice_desc" toml:"sercice_desc"` //service描述 SerciceDesc string `json:"sercice_desc" toml:"sercice_desc"` // sercice desc .service描述
IsDev bool `json:"is_dev" toml:"is_dev"` //是否是开发版本 IsDev bool `json:"is_dev" toml:"is_dev"` // Is it a development version?是否是开发版本
} }
var _map = Config{} var _map = Config{}
@@ -34,7 +34,7 @@ func onInit() {
} }
} }
//InitFile ... // InitFile default value from file .
func InitFile(filename string) error { func InitFile(filename string) error {
if _, err := toml.DecodeFile(filename, &_map); err != nil { if _, err := toml.DecodeFile(filename, &_map); err != nil {
fmt.Println("read toml error: ", err.Error()) fmt.Println("read toml error: ", err.Error())
@@ -44,7 +44,7 @@ func InitFile(filename string) error {
return nil return nil
} }
//GetServiceConfig 获取service配置信息 // GetServiceConfig Get service configuration information
func GetServiceConfig() (name, displayName, desc string) { func GetServiceConfig() (name, displayName, desc string) {
name = _map.ServiceName name = _map.ServiceName
displayName = _map.ServiceDisplayname displayName = _map.ServiceDisplayname

View File

@@ -10,7 +10,7 @@ const (
` `
) )
//IsRunTesting 判断是否在测试环境下使用 // IsRunTesting Determine whether to use it in a test environment.判断是否在测试环境下使用
func IsRunTesting() bool { func IsRunTesting() bool {
if len(os.Args) > 1 { if len(os.Args) > 1 {
return strings.HasPrefix(os.Args[1], "-test") return strings.HasPrefix(os.Args[1], "-test")

View File

@@ -1,12 +1,14 @@
package gtools package cnf
const ( // EImportsHead imports head options. import包含选项
_tagGorm = "gorm" var EImportsHead = map[string]string{
_tagJSON = "json" "stirng": `"string"`,
) "time.Time": `"time"`,
"gorm.Model": `"github.com/jinzhu/gorm"`,
}
//TypeDicMp 精确匹配类型 // TypeMysqlDicMp Accurate matching type.精确匹配类型
var TypeDicMp = map[string]string{ var TypeMysqlDicMp = map[string]string{
"int": "int", "int": "int",
"bigint": "int64", "bigint": "int64",
"varchar": "string", "varchar": "string",
@@ -22,8 +24,8 @@ var TypeDicMp = map[string]string{
"timestamp": "time.Time", "timestamp": "time.Time",
} }
//TypeMatchMp 模糊匹配类型 // TypeMysqlMatchMp Fuzzy Matching Types.模糊匹配类型
var TypeMatchMp = map[string]string{ var TypeMysqlMatchMp = map[string]string{
`^(int)[(]\d+[)]`: "int", `^(int)[(]\d+[)]`: "int",
`^(bigint)[(]\d+[)]`: "int64", `^(bigint)[(]\d+[)]`: "int64",
`^(char)[(]\d+[)]`: "string", `^(char)[(]\d+[)]`: "string",

View File

@@ -0,0 +1,17 @@
package generate
import "github.com/xxjwxc/public/tools"
// Add add one to print.打印
func (p *PrintAtom) Add(str ...interface{}) {
var tmp string
for _, v := range str {
tmp += tools.AsString(v) + _interval
}
p.lines = append(p.lines, tmp)
}
// Generates Get the generated list.获取生成列表
func (p *PrintAtom) Generates() []string {
return p.lines
}

View File

@@ -0,0 +1,9 @@
package generate
// interval.间隔
var _interval = "\t"
// PrintAtom . atom print .原始打印
type PrintAtom struct {
lines []string
}

View File

@@ -0,0 +1,7 @@
package generate
// IGenerate Generate Printing Interface.生成打印接口
type IGenerate interface {
// Get the generate data .获取结果数据
Generate() string
}

View File

@@ -1,4 +1,4 @@
package generate package genstruct
import ( import (
"fmt" "fmt"
@@ -6,40 +6,26 @@ import (
"strings" "strings"
"github.com/xxjwxc/gormt/data/config" "github.com/xxjwxc/gormt/data/config"
"github.com/xxjwxc/gormt/data/view/cnf"
"github.com/xxjwxc/public/tools" "github.com/xxjwxc/gormt/data/view/generate"
) )
//Add 打印 // SetName Setting element name.设置元素名字
func (p *PrintAtom) Add(str ...interface{}) {
var tmp string
for _, v := range str {
tmp += tools.AsString(v) + _interval
}
p.lines = append(p.lines, tmp)
}
//Generate 打印
func (p *PrintAtom) Generate() []string {
return p.lines
}
//SetName 设置元素名字
func (e *GenElement) SetName(name string) { func (e *GenElement) SetName(name string) {
e.Name = name e.Name = name
} }
//SetType 设置元素类型 // SetType Setting element type.设置元素类型
func (e *GenElement) SetType(tp string) { func (e *GenElement) SetType(tp string) {
e.Type = tp e.Type = tp
} }
//SetNotes 设置注释 // SetNotes Setting element notes.设置注释
func (e *GenElement) SetNotes(notes string) { func (e *GenElement) SetNotes(notes string) {
e.Notes = strings.Replace(notes, "\n", ",", -1) e.Notes = strings.Replace(notes, "\n", ",", -1)
} }
//AddTag 添加一个tag标记 // AddTag Add a tag .添加一个tag标记
func (e *GenElement) AddTag(k string, v string) { func (e *GenElement) AddTag(k string, v string) {
if e.Tags == nil { if e.Tags == nil {
e.Tags = make(map[string][]string) e.Tags = make(map[string][]string)
@@ -47,7 +33,7 @@ func (e *GenElement) AddTag(k string, v string) {
e.Tags[k] = append(e.Tags[k], v) e.Tags[k] = append(e.Tags[k], v)
} }
//Generate 获取结果数据 // Generate Get the result data.获取结果数据
func (e *GenElement) Generate() string { func (e *GenElement) Generate() string {
tag := "" tag := ""
@@ -65,31 +51,31 @@ func (e *GenElement) Generate() string {
tag = fmt.Sprintf("`%v`", strings.Join(tags, " ")) tag = fmt.Sprintf("`%v`", strings.Join(tags, " "))
} }
var p PrintAtom var p generate.PrintAtom
if len(e.Notes) > 0 { if len(e.Notes) > 0 {
p.Add(e.Name, e.Type, tag, "// "+e.Notes) p.Add(e.Name, e.Type, tag, "// "+e.Notes)
} else { } else {
p.Add(e.Name, e.Type, tag) p.Add(e.Name, e.Type, tag)
} }
return p.Generate()[0] return p.Generates()[0]
} }
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// struct // struct
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
//SetCreatTableStr 设置创建语句,备份使用 // SetCreatTableStr Set up SQL create statement, backup use setup create statement, backup use.设置创建语句,备份使用
func (s *GenStruct) SetCreatTableStr(sql string) { func (s *GenStruct) SetCreatTableStr(sql string) {
s.SQLBuildStr = sql s.SQLBuildStr = sql
} }
//SetStructName 获取结果数据 // SetStructName Setting the name of struct.设置struct名字
func (s *GenStruct) SetStructName(name string) { func (s *GenStruct) SetStructName(name string) {
s.Name = name s.Name = name
} }
//SetNotes 设置注释 // SetNotes set the notes.设置注释
func (s *GenStruct) SetNotes(notes string) { func (s *GenStruct) SetNotes(notes string) {
a := strings.Split(notes, "\n") a := strings.Split(notes, "\n")
var text []string var text []string
@@ -102,14 +88,14 @@ func (s *GenStruct) SetNotes(notes string) {
s.Notes = strings.Join(text, "\r\n") s.Notes = strings.Join(text, "\r\n")
} }
//AddElement 添加一个/或多个元素 // AddElement Add one or more elements.添加一个/或多个元素
func (s *GenStruct) AddElement(e ...GenElement) { func (s *GenStruct) AddElement(e ...GenElement) {
s.Em = append(s.Em, e...) s.Em = append(s.Em, e...)
} }
//Generate 获取结果数据 // Generates Get the result data.获取结果数据
func (s *GenStruct) Generate() []string { func (s *GenStruct) Generates() []string {
var p PrintAtom var p generate.PrintAtom
if !config.GetSimple() { if !config.GetSimple() {
p.Add("/******sql******") p.Add("/******sql******")
p.Add(s.SQLBuildStr) p.Add(s.SQLBuildStr)
@@ -122,19 +108,19 @@ func (s *GenStruct) Generate() []string {
} }
p.Add("}") p.Add("}")
return p.Generate() return p.Generates()
} }
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// package // package
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
//SetPackage 定义包名 // SetPackage Defining package names.定义包名
func (p *GenPackage) SetPackage(pname string) { func (p *GenPackage) SetPackage(pname string) {
p.Name = pname p.Name = pname
} }
//AddImport 通过类型添加import // AddImport Add import by type.通过类型添加import
func (p *GenPackage) AddImport(imp string) { func (p *GenPackage) AddImport(imp string) {
if p.Imports == nil { if p.Imports == nil {
p.Imports = make(map[string]string) p.Imports = make(map[string]string)
@@ -142,16 +128,16 @@ func (p *GenPackage) AddImport(imp string) {
p.Imports[imp] = imp p.Imports[imp] = imp
} }
//AddStruct 添加一个结构体 // AddStruct Add a structure.添加一个结构体
func (p *GenPackage) AddStruct(st GenStruct) { func (p *GenPackage) AddStruct(st GenStruct) {
p.Structs = append(p.Structs, st) p.Structs = append(p.Structs, st)
} }
//Generate 获取结果数据 // Generate Get the result data.获取结果数据
func (p *GenPackage) Generate() string { func (p *GenPackage) Generate() string {
p.genimport() //补充 import p.genimport() // auto add import .补充 import
var pa PrintAtom var pa generate.PrintAtom
pa.Add("package", p.Name) pa.Add("package", p.Name)
// add import // add import
if p.Imports != nil { if p.Imports != nil {
@@ -164,26 +150,26 @@ func (p *GenPackage) Generate() string {
// -----------end // -----------end
// add struct // add struct
for _, v := range p.Structs { for _, v := range p.Structs {
for _, v1 := range v.Generate() { for _, v1 := range v.Generates() {
pa.Add(v1) pa.Add(v1)
} }
} }
// -----------end // -----------end
//输出 // output.输出
strOut := "" strOut := ""
for _, v := range pa.Generate() { for _, v := range pa.Generates() {
strOut += v + "\n" strOut += v + "\n"
} }
return strOut return strOut
} }
//获取结果数据 // compensate and import .获取结果数据
func (p *GenPackage) genimport() { func (p *GenPackage) genimport() {
for _, v := range p.Structs { for _, v := range p.Structs {
for _, v1 := range v.Em { for _, v1 := range v.Em {
if v2, ok := EImportsHead[v1.Type]; ok { if v2, ok := cnf.EImportsHead[v1.Type]; ok {
if len(v2) > 0 { if len(v2) > 0 {
p.AddImport(v2) p.AddImport(v2)
} }

View File

@@ -0,0 +1,24 @@
package genstruct
// GenElement element of sturct.元素类
type GenElement struct {
Name string // Name.元素名
Type string // Type.类型标记
Notes string // Notes.注释
Tags map[string][]string // tages.标记
}
// GenStruct struct of IStruct .结构体
type GenStruct struct {
SQLBuildStr string // Create SQL statements.创建sql语句
Name string // name.名字
Notes string // notes.注释
Em []GenElement // em.元素组合
}
// GenPackage package of IPackage.包体
type GenPackage struct {
Name string // name.名字
Imports map[string]string // Inclusion term.元素组合
Structs []GenStruct // struct list .结构体组合
}

View File

@@ -0,0 +1,47 @@
package genstruct
import "github.com/xxjwxc/gormt/data/view/generate"
// IPackage package of interface
type IPackage interface {
generate.IGenerate
// Defining package names.定义包名
SetPackage(string)
// Add import by type.通过类型添加import
AddImport(string)
// Add a structure.添加一个结构体
AddStruct(IStruct)
}
// IStruct struct of interface
type IStruct interface {
generate.IGenerate
// Set up SQL create statement, backup use.设置创建语句,备份使用
SetCreatTableStr(string)
// Setting Structural Name设置结构体名字
SetStructName(string)
// setting the notes.设置注释
SetNotes(string)
// add one element.添加一个元素
AddElement(...IElement)
}
// IElement element in stuct of interface.元素类
type IElement interface {
generate.IGenerate
// setting name of element.设置元素名字
SetName(string)
// Setting element type.设置元素类型
SetType(string)
// setting notes of element .设置注释
SetNotes(string)
// add one tag.添加一个tag标记
AddTag(k string, v string)
}

View File

@@ -1,90 +0,0 @@
package generate
//IPackage 包类
type IPackage interface {
//定义包名
SetPackage(string)
//通过类型添加import
AddImport(string)
//添加一个结构体
AddStruct(IStruct)
//获取结果数据
Generate() string
}
//IStruct 结构体类
type IStruct interface {
//设置创建语句,备份使用
SetCreatTableStr(string)
//设置结构体名字
SetStructName(string)
//设置注释
SetNotes(string)
//添加一个元素
AddElement(...IElement)
//获取结果数据
Generate() []string
}
//IElement 元素类
type IElement interface {
//设置元素名字
SetName(string)
//设置元素类型
SetType(string)
//设置注释
SetNotes(string)
//添加一个tag标记
AddTag(k string, v string)
//获取结果数据
Generate() string
}
//////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////
//GenElement 元素类
type GenElement struct {
Name string //元素名
Type string //类型标记
Notes string //注释
Tags map[string][]string //标记
}
//GenStruct 结构体
type GenStruct struct {
SQLBuildStr string //创建sql语句
Name string //名字
Notes string //注释
Em []GenElement //元素组合
}
//GenPackage 包体
type GenPackage struct {
Name string //名字
Imports map[string]string //元素组合
Structs []GenStruct //结构体组合
}
//间隔
var _interval = "\t"
//EImportsHead .
var EImportsHead = map[string]string{
"stirng": `"string"`,
"time.Time": `"time"`,
"gorm.Model": `"github.com/jinzhu/gorm"`,
}
//PrintAtom .
type PrintAtom struct {
lines []string
}

View File

@@ -6,23 +6,20 @@ import (
"strings" "strings"
"github.com/xxjwxc/gormt/data/config" "github.com/xxjwxc/gormt/data/config"
"github.com/xxjwxc/gormt/data/view/model/genmysql"
"github.com/xxjwxc/public/mysqldb"
"github.com/xxjwxc/public/tools" "github.com/xxjwxc/public/tools"
) )
//Execute 开始执行 // Execute
func Execute() { func Execute() {
orm := mysqldb.OnInitDBOrm(config.GetMysqlConStr())
defer orm.OnDestoryDB()
// var tt oauth_db.UserInfoTbl // var tt oauth_db.UserInfoTbl
// tt.Nickname = "ticket_001" // tt.Nickname = "ticket_001"
// orm.Where("nickname = ?", "ticket_001").Find(&tt) // orm.Where("nickname = ?", "ticket_001").Find(&tt)
// fmt.Println(tt) // fmt.Println(tt)
pkg := OnGetPackageInfo(orm, OnGetTables(orm)) pkg := genmysql.GenMysql()
pkg.SetPackage(getPkgName()) pkg.SetPackage(getPkgName())
str := pkg.Generate() str := pkg.Generate()
@@ -39,7 +36,7 @@ func Execute() {
fmt.Println(string(cmd)) fmt.Println(string(cmd))
} }
// 通过config outdir 配置获取 // Getting package names through config outdir configuration.通过config outdir 配置获取
func getPkgName() string { func getPkgName() string {
dir := config.GetOutDir() dir := config.GetOutDir()
dir = strings.Replace(dir, "\\", "/", -1) dir = strings.Replace(dir, "\\", "/", -1)

View File

@@ -0,0 +1 @@
package genmysql

View File

@@ -0,0 +1,15 @@
package genmysql
const (
_tagGorm = "gorm"
_tagJSON = "json"
)
// GenColumns show full columns
type GenColumns struct {
Field string `gorm:"column:Field"`
Type string `gorm:"column:Type"`
Key string `gorm:"column:Key"`
Desc string `gorm:"column:Comment"`
Null string `gorm:"column:Null"`
}

View File

@@ -1,4 +1,4 @@
package gtools package genmysql
import ( import (
"fmt" "fmt"
@@ -6,17 +6,25 @@ import (
"strings" "strings"
"github.com/xxjwxc/gormt/data/config" "github.com/xxjwxc/gormt/data/config"
"github.com/xxjwxc/gormt/data/view/gtools/generate" "github.com/xxjwxc/gormt/data/view/cnf"
"github.com/xxjwxc/gormt/data/view/genstruct"
"github.com/xxjwxc/public/mybigcamel" "github.com/xxjwxc/public/mybigcamel"
"github.com/xxjwxc/public/mysqldb" "github.com/xxjwxc/public/mysqldb"
) )
//OnGetTables 获取表列及注释 // GenMysql 开始mysql解析
func GenMysql() genstruct.GenPackage {
orm := mysqldb.OnInitDBOrm(config.GetMysqlConStr())
defer orm.OnDestoryDB()
return OnGetPackageInfo(orm, OnGetTables(orm))
}
// OnGetTables Get columns and comments.获取表列及注释
func OnGetTables(orm *mysqldb.MySqlDB) map[string]string { func OnGetTables(orm *mysqldb.MySqlDB) map[string]string {
tbDesc := make(map[string]string) tbDesc := make(map[string]string)
//获取列名 // Get column names.获取列名
var tables []string var tables []string
rows, err := orm.Raw("show tables").Rows() rows, err := orm.Raw("show tables").Rows()
if err != nil { if err != nil {
@@ -32,7 +40,7 @@ func OnGetTables(orm *mysqldb.MySqlDB) map[string]string {
tbDesc[table] = "" tbDesc[table] = ""
} }
//获取表注释 // Get table annotations.获取表注释
rows, err = orm.Raw("SELECT TABLE_NAME,TABLE_COMMENT FROM information_schema.TABLES WHERE table_schema=?;", rows, err = orm.Raw("SELECT TABLE_NAME,TABLE_COMMENT FROM information_schema.TABLES WHERE table_schema=?;",
config.GetMysqlDbInfo().Database).Rows() config.GetMysqlDbInfo().Database).Rows()
if err != nil { if err != nil {
@@ -49,18 +57,18 @@ func OnGetTables(orm *mysqldb.MySqlDB) map[string]string {
return tbDesc return tbDesc
} }
//OnGetPackageInfo 获取包信息 // OnGetPackageInfo getpackage info.获取包信息
func OnGetPackageInfo(orm *mysqldb.MySqlDB, tabls map[string]string) generate.GenPackage { func OnGetPackageInfo(orm *mysqldb.MySqlDB, tabls map[string]string) genstruct.GenPackage {
var pkg generate.GenPackage var pkg genstruct.GenPackage
for tab, desc := range tabls { for tab, desc := range tabls {
var sct generate.GenStruct var sct genstruct.GenStruct
sct.SetStructName(OnGetCamelName(tab)) //大驼峰 sct.SetStructName(OnGetCamelName(tab)) // Big hump.大驼峰
sct.SetNotes(desc) sct.SetNotes(desc)
//构造元素 // build element.构造元素
ems := OnGetTableElement(orm, tab) ems := OnGetTableElement(orm, tab)
// --------end // --------end
sct.AddElement(ems...) sct.AddElement(ems...)
//获取表注释 // Get table annotations.获取表注释
rows, err := orm.Raw("show create table " + tab).Rows() rows, err := orm.Raw("show create table " + tab).Rows()
defer rows.Close() defer rows.Close()
if err == nil { if err == nil {
@@ -78,12 +86,12 @@ func OnGetPackageInfo(orm *mysqldb.MySqlDB, tabls map[string]string) generate.Ge
return pkg return pkg
} }
//OnGetTableElement 获取表列及注释 // OnGetTableElement Get table columns and comments.获取表列及注释
func OnGetTableElement(orm *mysqldb.MySqlDB, tab string) []generate.GenElement { func OnGetTableElement(orm *mysqldb.MySqlDB, tab string) []genstruct.GenElement {
var el []generate.GenElement var el []genstruct.GenElement
keyNums := make(map[string]int) keyNums := make(map[string]int)
//获取keys // get keys
var Keys []struct { var Keys []struct {
NonUnique int `gorm:"column:Non_unique"` NonUnique int `gorm:"column:Non_unique"`
KeyName string `gorm:"column:Key_name"` KeyName string `gorm:"column:Key_name"`
@@ -95,31 +103,24 @@ func OnGetTableElement(orm *mysqldb.MySqlDB, tab string) []generate.GenElement {
} }
// ----------end // ----------end
var list []struct { var list []GenColumns
Field string `gorm:"column:Field"` // Get table annotations.获取表注释
Type string `gorm:"column:Type"`
Key string `gorm:"column:Key"`
Desc string `gorm:"column:Comment"`
Null string `gorm:"column:Null"`
}
//获取表注释
orm.Raw("show FULL COLUMNS from " + tab).Find(&list) orm.Raw("show FULL COLUMNS from " + tab).Find(&list)
//过滤 gorm.Model // filter gorm.Model.过滤 gorm.Model
if OnHaveModel(&list) { if OnHaveModel(&list) {
var tmp generate.GenElement var tmp genstruct.GenElement
tmp.SetType("gorm.Model") tmp.SetType("gorm.Model")
el = append(el, tmp) el = append(el, tmp)
} }
// -----------------end // -----------------end
for _, v := range list { for _, v := range list {
var tmp generate.GenElement var tmp genstruct.GenElement
tmp.SetName(OnGetCamelName(v.Field)) tmp.SetName(OnGetCamelName(v.Field))
tmp.SetNotes(v.Desc) tmp.SetNotes(v.Desc)
tmp.SetType(OnGetTypeName(v.Type)) tmp.SetType(OnGetTypeName(v.Type))
if strings.EqualFold(v.Key, "PRI") { //设置主键 if strings.EqualFold(v.Key, "PRI") { // Set primary key.设置主键
tmp.AddTag(_tagGorm, "primary_key") tmp.AddTag(_tagGorm, "primary_key")
} else if strings.EqualFold(v.Key, "UNI") { // unique } else if strings.EqualFold(v.Key, "UNI") { // unique
tmp.AddTag(_tagGorm, "unique") tmp.AddTag(_tagGorm, "unique")
@@ -133,7 +134,7 @@ func OnGetTableElement(orm *mysqldb.MySqlDB, tab string) []generate.GenElement {
} else { } else {
_val += "unique_index" _val += "unique_index"
} }
if keyNums[v1.KeyName] > 1 { //复合索引 if keyNums[v1.KeyName] > 1 { // Composite index.复合索引
_val += ":" + v1.KeyName _val += ":" + v1.KeyName
} }
@@ -159,28 +160,14 @@ func OnGetTableElement(orm *mysqldb.MySqlDB, tab string) []generate.GenElement {
tmp.AddTag(_tagJSON, v.Field) tmp.AddTag(_tagJSON, v.Field)
} }
} }
el = append(el, tmp) el = append(el, tmp)
} }
return el return el
} }
//OnHaveModel 过滤 gorm.Model // OnHaveModel filter.过滤 gorm.Model
func OnHaveModel(list *[]struct { func OnHaveModel(list *[]GenColumns) bool {
Field string `gorm:"column:Field"` var _temp []GenColumns
Type string `gorm:"column:Type"`
Key string `gorm:"column:Key"`
Desc string `gorm:"column:Comment"`
Null string `gorm:"column:Null"`
}) bool {
var _temp []struct {
Field string `gorm:"column:Field"`
Type string `gorm:"column:Type"`
Key string `gorm:"column:Key"`
Desc string `gorm:"column:Comment"`
Null string `gorm:"column:Null"`
}
num := 0 num := 0
for _, v := range *list { for _, v := range *list {
@@ -202,37 +189,37 @@ func OnHaveModel(list *[]struct {
return false return false
} }
//OnGetTypeName 类型获取过滤 // OnGetTypeName Type acquisition filtering.类型获取过滤
func OnGetTypeName(name string) string { func OnGetTypeName(name string) string {
//先精确匹配 // Precise matching first.先精确匹配
if v, ok := TypeDicMp[name]; ok { if v, ok := cnf.TypeMysqlDicMp[name]; ok {
return v return v
} }
//模糊正则匹配 // Fuzzy Regular Matching.模糊正则匹配
for k, v := range TypeMatchMp { for k, v := range cnf.TypeMysqlMatchMp {
if ok, _ := regexp.MatchString(k, name); ok { if ok, _ := regexp.MatchString(k, name); ok {
return v return v
} }
} }
panic(fmt.Sprintf("type (%v) not match in any way.", name)) panic(fmt.Sprintf("type (%v) not match in any way.maybe need to add on ()", name))
} }
//OnGetCamelName 大驼峰或者首字母大写 // OnGetCamelName Big Hump or Capital Letter.大驼峰或者首字母大写
func OnGetCamelName(name string) string { func OnGetCamelName(name string) string {
if config.GetSingularTable() { //如果全局禁用表名复数 if config.GetSingularTable() { // If the table name plural is globally disabled.如果全局禁用表名复数
return TitleCase(name) return TitleCase(name)
} }
return mybigcamel.Marshal(name) return mybigcamel.Marshal(name)
} }
//TitleCase 首字母大写 // TitleCase title case.首字母大写
func TitleCase(name string) string { func TitleCase(name string) string {
vv := []rune(name) vv := []rune(name)
if len(vv) > 0 { if len(vv) > 0 {
if bool(vv[0] >= 'a' && vv[0] <= 'z') { //首字母大写 if bool(vv[0] >= 'a' && vv[0] <= 'z') { // title case.首字母大写
vv[0] -= 32 vv[0] -= 32
} }
} }