|
|
|
package makemodel
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Column struct {
|
|
|
|
ColumnName string `gorm:"column:COLUMN_NAME"`
|
|
|
|
DataType string `gorm:"column:DATA_TYPE"`
|
|
|
|
ColumnKey string `gorm:"column:COLUMN_KEY"`
|
|
|
|
ColumnComment string `gorm:"column:COLUMN_COMMENT"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create @Title 创建model
|
|
|
|
func Create(db *gorm.DB, table string, path ...string) error {
|
|
|
|
var columns []Column
|
|
|
|
sql := fmt.Sprintf("select * from information_schema.COLUMNS where table_name ='%s' order by ordinal_position", db.NamingStrategy.TableName(table))
|
|
|
|
db.Raw(sql).Scan(&columns)
|
|
|
|
tableName := camelString(table)
|
|
|
|
|
|
|
|
strContent := "type " + tableName + " struct {\n"
|
|
|
|
imports := map[string]bool{}
|
|
|
|
for _, column := range columns {
|
|
|
|
columnType := ""
|
|
|
|
switch column.DataType {
|
|
|
|
case "varchar", "text":
|
|
|
|
columnType = "string"
|
|
|
|
case "int", "tinyint":
|
|
|
|
columnType = "uint"
|
|
|
|
case "decimal":
|
|
|
|
columnType = "decimal.Decimal"
|
|
|
|
imports["github.com/shopspring/decimal"] = true
|
|
|
|
case "datetime":
|
|
|
|
if column.ColumnName == "deleted_at" {
|
|
|
|
columnType = "gorm.DeletedAt"
|
|
|
|
imports["gorm.io/gorm"] = true
|
|
|
|
} else {
|
|
|
|
columnType = "time.Time"
|
|
|
|
imports["time"] = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pri := ""
|
|
|
|
if column.ColumnKey == "PRI" {
|
|
|
|
pri = "`gorm:\"primaryKey\"`"
|
|
|
|
}
|
|
|
|
comment := ""
|
|
|
|
if column.ColumnComment != "" {
|
|
|
|
comment = "// " + column.ColumnComment
|
|
|
|
}
|
|
|
|
strContent += fmt.Sprintf("\t%s %s %s%s\n", camelString(column.ColumnName), columnType, pri, comment)
|
|
|
|
}
|
|
|
|
strContent += "}"
|
|
|
|
headerStr := "package model\n\nimport(\n"
|
|
|
|
for key, _ := range imports {
|
|
|
|
headerStr += fmt.Sprintf("\t\"%s\"\n", key)
|
|
|
|
}
|
|
|
|
headerStr += ")\n\n"
|
|
|
|
strContent = headerStr + strContent
|
|
|
|
|
|
|
|
fileName := strings.ToLower(tableName[0:1]) + tableName[1:]
|
|
|
|
dir := ""
|
|
|
|
if len(path) > 0 {
|
|
|
|
dir = path[0]
|
|
|
|
os.MkdirAll(dir, 0777)
|
|
|
|
}
|
|
|
|
f, err := os.OpenFile(filepath.Join(dir, fileName+".go"), os.O_CREATE|os.O_RDWR, 0644)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer f.Close()
|
|
|
|
_, err = f.WriteString(strContent)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// camel string, xx_yy to XxYy
|
|
|
|
func camelString(s string) string {
|
|
|
|
data := make([]byte, 0, len(s))
|
|
|
|
j := false
|
|
|
|
k := false
|
|
|
|
num := len(s) - 1
|
|
|
|
for i := 0; i <= num; i++ {
|
|
|
|
d := s[i]
|
|
|
|
if k == false && d >= 'A' && d <= 'Z' {
|
|
|
|
k = true
|
|
|
|
}
|
|
|
|
if d >= 'a' && d <= 'z' && (j || k == false) {
|
|
|
|
d = d - 32
|
|
|
|
j = false
|
|
|
|
k = true
|
|
|
|
}
|
|
|
|
if k && d == '_' && num > i && s[i+1] >= 'a' && s[i+1] <= 'z' {
|
|
|
|
j = true
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
data = append(data, d)
|
|
|
|
}
|
|
|
|
return string(data[:])
|
|
|
|
}
|