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.
165 lines
3.5 KiB
Go
165 lines
3.5 KiB
Go
package modelgen
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
"text/template"
|
|
|
|
"zero/tools/modelctl/model"
|
|
)
|
|
|
|
var (
|
|
queryRows = `COLUMN_NAME AS name,ORDINAL_POSITION AS position,DATA_TYPE AS type,COLUMN_KEY AS k,COLUMN_COMMENT AS comment`
|
|
)
|
|
|
|
type (
|
|
Config struct {
|
|
// 是否需要生成redis缓存代码逻辑
|
|
WithCache bool
|
|
// 是否强制覆盖已有文件,如果是将导致原已修改文件找不回
|
|
Force bool
|
|
// mysql访问用户
|
|
Username string
|
|
// mysql访问密码
|
|
Password string
|
|
// mysql连接地址
|
|
Address string
|
|
// 库名
|
|
TableSchema string
|
|
// 待生成model所依赖的表
|
|
Tables []string `json:"Tables,omitempty"`
|
|
}
|
|
)
|
|
|
|
// 生成model相关go文件
|
|
func genModelWithConfigFile(path string) error {
|
|
bts, err := ioutil.ReadFile(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
var c Config
|
|
err = json.Unmarshal(bts, &c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
dataSourceTemplate := `{{.Username}}:{{.Password}}@tcp({{.Address}})/information_schema`
|
|
tl, err := template.New("").Parse(dataSourceTemplate)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
var dataSourceBuffer = new(bytes.Buffer)
|
|
err = tl.Execute(dataSourceBuffer, c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = genModelWithDataSource(dataSourceBuffer.String(), c.TableSchema, c.Force, c.WithCache, c.Tables)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func genModelWithDataSource(dataSource, schema string, force, redis bool, tables []string) error {
|
|
fieldModel := NewFieldModel(dataSource, schema)
|
|
if len(tables) == 0 {
|
|
tableList, err := fieldModel.findTables()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
tables = append(tables, tableList...)
|
|
}
|
|
// 暂定package为model
|
|
packageName := "model"
|
|
utilTemplate := &Template{Package: packageName, WithCache: redis}
|
|
|
|
err := generateUtilModel(force, utilTemplate)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, table := range tables {
|
|
fieldList, err := fieldModel.findColumns(table)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
modelTemplate, err := generateModelTemplate(packageName, table, fieldList)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
modelTemplate.WithCache = redis
|
|
err = generateSqlModel(force, modelTemplate)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
fmt.Println("model generate done ...")
|
|
return nil
|
|
}
|
|
|
|
// 生成util model
|
|
func generateUtilModel(force bool, data *Template) error {
|
|
tl, err := template.New("").Parse(utilTemplateText)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fileName := "util.go"
|
|
_, err = os.Stat(fileName)
|
|
if err == nil {
|
|
if !force {
|
|
return nil
|
|
}
|
|
os.Remove(fileName)
|
|
}
|
|
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, model.ModeDirPerm)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
err = tl.Execute(file, data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cmd := exec.Command("goimports", "-w", fileName)
|
|
err = cmd.Run()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// 生成sql对应model
|
|
func generateSqlModel(force bool, data *Template) error {
|
|
tl, err := template.New("").Parse(modelTemplateText)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fileName := strings.ToLower(data.ModelCamelWithLowerStart + "model.go")
|
|
_, err = os.Stat(fileName)
|
|
if err == nil {
|
|
if !force {
|
|
fmt.Println(fileName + " already exists")
|
|
return nil
|
|
}
|
|
os.Remove(fileName)
|
|
}
|
|
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0755)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
err = tl.Execute(file, data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cmd := exec.Command("goimports", "-w", fileName)
|
|
err = cmd.Run()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|