You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

226 lines
5.5 KiB
Go

package genmysql
import (
"fmt"
"sort"
"strings"
"github.com/xxjwxc/gormt/data/config"
"github.com/xxjwxc/gormt/data/view/model"
"github.com/xxjwxc/public/mysqldb"
"github.com/xxjwxc/public/tools"
)
// MySQLModel mysql model from IModel
var MySQLModel mysqlModel
type mysqlModel struct {
}
// GenModel get model.DBInfo info.获取数据库相关属性
func (m *mysqlModel) GenModel() model.DBInfo {
orm := mysqldb.OnInitDBOrm(config.GetMysqlConStr())
defer orm.OnDestoryDB()
var dbInfo model.DBInfo
getPackageInfo(orm, &dbInfo)
dbInfo.PackageName = m.GetPkgName()
dbInfo.DbName = m.GetDbName()
return dbInfo
}
// GetDbName get database name.获取数据库名字
func (m *mysqlModel) GetDbName() string {
return config.GetMysqlDbInfo().Database
}
// GetPkgName package names through config outdir configuration.通过config outdir 配置获取包名
func (m *mysqlModel) GetPkgName() string {
dir := config.GetOutDir()
dir = strings.Replace(dir, "\\", "/", -1)
if len(dir) > 0 {
if dir[len(dir)-1] == '/' {
dir = dir[:(len(dir) - 1)]
}
}
var pkgName string
list := strings.Split(dir, "/")
if len(list) > 0 {
pkgName = list[len(list)-1]
}
if len(pkgName) == 0 || pkgName == "." {
list = strings.Split(tools.GetModelPath(), "/")
if len(list) > 0 {
pkgName = list[len(list)-1]
}
}
return pkgName
}
func getPackageInfo(orm *mysqldb.MySqlDB, info *model.DBInfo) {
tabls := getTables(orm) // get table and notes
// if m := config.GetTableList(); len(m) > 0 {
// // 制定了表之后
// newTabls := make(map[string]string)
// for t := range m {
// if notes, ok := tabls[t]; ok {
// newTabls[t] = notes
// } else {
// fmt.Printf("table: %s not found in db\n", t)
// }
// }
// tabls = newTabls
// }
for tabName, notes := range tabls {
var tab model.TabInfo
tab.Name = tabName
tab.Notes = notes
if config.GetIsOutSQL() {
// Get create SQL statements.获取创建sql语句
rows, err := orm.Raw("show create table " + assemblyTable(tabName)).Rows()
//defer rows.Close()
if err == nil {
if rows.Next() {
var table, CreateTable string
rows.Scan(&table, &CreateTable)
tab.SQLBuildStr = CreateTable
}
}
rows.Close()
// ----------end
}
// build element.构造元素
tab.Em = getTableElement(orm, tabName)
// --------end
info.TabList = append(info.TabList, tab)
}
// sort tables
sort.Slice(info.TabList, func(i, j int) bool {
return info.TabList[i].Name < info.TabList[j].Name
})
}
// getTableElement Get table columns and comments.获取表列及注释
func getTableElement(orm *mysqldb.MySqlDB, tab string) (el []model.ColumnsInfo) {
keyNums := make(map[string]int)
// get keys
var Keys []keys
orm.Raw("show keys from " + assemblyTable(tab)).Scan(&Keys)
for _, v := range Keys {
keyNums[v.KeyName]++
}
// ----------end
var list []genColumns
// Get table annotations.获取表注释
orm.Raw("show FULL COLUMNS from " + assemblyTable(tab)).Scan(&list)
// filter gorm.Model.过滤 gorm.Model
if filterModel(&list) {
el = append(el, model.ColumnsInfo{
Type: "gorm.Model",
})
}
// -----------------end
// ForeignKey
var foreignKeyList []genForeignKey
if config.GetIsForeignKey() {
sql := fmt.Sprintf(`select table_schema,table_name,column_name,referenced_table_schema,referenced_table_name,referenced_column_name from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
where table_schema = '%v' AND REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_NAME = '%v'`, config.GetMysqlDbInfo().Database, tab)
orm.Raw(sql).Scan(&foreignKeyList)
}
// ------------------end
for _, v := range list {
var tmp model.ColumnsInfo
tmp.Name = v.Field
tmp.Notes = v.Desc
tmp.Type = v.Type
// keys
if strings.EqualFold(v.Key, "PRI") { // Set primary key.设置主键
tmp.Index = append(tmp.Index, model.KList{
Key: model.ColumnsKeyPrimary,
})
} else if strings.EqualFold(v.Key, "UNI") { // unique
tmp.Index = append(tmp.Index, model.KList{
Key: model.ColumnsKeyUnique,
})
} else {
for _, v1 := range Keys {
if strings.EqualFold(v1.ColumnName, v.Field) {
var k model.KList
if v1.NonUnique == 1 { // index
k.Key = model.ColumnsKeyIndex
} else {
k.Key = model.ColumnsKeyUniqueIndex
}
if keyNums[v1.KeyName] > 1 { // Composite index.复合索引
k.KeyName = v1.KeyName
}
tmp.Index = append(tmp.Index, k)
}
}
}
tmp.IsNull = strings.EqualFold(v.Null, "YES")
// ForeignKey
fixForeignKey(foreignKeyList, tmp.Name, &tmp.ForeignKeyList)
// -----------------end
el = append(el, tmp)
}
return
}
// getTables Get columns and comments.获取表列及注释
func getTables(orm *mysqldb.MySqlDB) map[string]string {
tbDesc := make(map[string]string)
// Get column names.获取列名
var tables []string
rows, err := orm.Raw("show tables").Rows()
if err != nil {
if !config.GetIsGUI() {
fmt.Println(err)
}
return tbDesc
}
for rows.Next() {
var table string
rows.Scan(&table)
tables = append(tables, table)
tbDesc[table] = ""
}
rows.Close()
// Get table annotations.获取表注释
rows1, err := orm.Raw("SELECT TABLE_NAME,TABLE_COMMENT FROM information_schema.TABLES WHERE table_schema= '" + config.GetMysqlDbInfo().Database + "'").Rows()
if err != nil {
if !config.GetIsGUI() {
fmt.Println(err)
}
return tbDesc
}
for rows1.Next() {
var table, desc string
rows1.Scan(&table, &desc)
tbDesc[table] = desc
}
rows1.Close()
return tbDesc
}
func assemblyTable(name string) string {
return "`" + name + "`"
}