123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- package modelgen
- import (
- "bytes"
- "encoding/json"
- "fmt"
- "io/ioutil"
- "os"
- "os/exec"
- "strings"
- "text/template"
- "github.com/tal-tech/go-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
- }
|