genmodel.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package modelgen
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "os"
  8. "os/exec"
  9. "strings"
  10. "text/template"
  11. "github.com/tal-tech/go-zero/tools/modelctl/model"
  12. )
  13. var (
  14. queryRows = `COLUMN_NAME AS name,ORDINAL_POSITION AS position,DATA_TYPE AS type,COLUMN_KEY AS k,COLUMN_COMMENT AS comment`
  15. )
  16. type (
  17. Config struct {
  18. // 是否需要生成redis缓存代码逻辑
  19. WithCache bool
  20. // 是否强制覆盖已有文件,如果是将导致原已修改文件找不回
  21. Force bool
  22. // mysql访问用户
  23. Username string
  24. // mysql访问密码
  25. Password string
  26. // mysql连接地址
  27. Address string
  28. // 库名
  29. TableSchema string
  30. // 待生成model所依赖的表
  31. Tables []string `json:"Tables,omitempty"`
  32. }
  33. )
  34. // 生成model相关go文件
  35. func genModelWithConfigFile(path string) error {
  36. bts, err := ioutil.ReadFile(path)
  37. if err != nil {
  38. return err
  39. }
  40. var c Config
  41. err = json.Unmarshal(bts, &c)
  42. if err != nil {
  43. return err
  44. }
  45. dataSourceTemplate := `{{.Username}}:{{.Password}}@tcp({{.Address}})/information_schema`
  46. tl, err := template.New("").Parse(dataSourceTemplate)
  47. if err != nil {
  48. return err
  49. }
  50. var dataSourceBuffer = new(bytes.Buffer)
  51. err = tl.Execute(dataSourceBuffer, c)
  52. if err != nil {
  53. return err
  54. }
  55. err = genModelWithDataSource(dataSourceBuffer.String(), c.TableSchema, c.Force, c.WithCache, c.Tables)
  56. if err != nil {
  57. return err
  58. }
  59. return nil
  60. }
  61. func genModelWithDataSource(dataSource, schema string, force, redis bool, tables []string) error {
  62. fieldModel := NewFieldModel(dataSource, schema)
  63. if len(tables) == 0 {
  64. tableList, err := fieldModel.findTables()
  65. if err != nil {
  66. return err
  67. }
  68. tables = append(tables, tableList...)
  69. }
  70. // 暂定package为model
  71. packageName := "model"
  72. utilTemplate := &Template{Package: packageName, WithCache: redis}
  73. err := generateUtilModel(force, utilTemplate)
  74. if err != nil {
  75. return err
  76. }
  77. for _, table := range tables {
  78. fieldList, err := fieldModel.findColumns(table)
  79. if err != nil {
  80. return err
  81. }
  82. modelTemplate, err := generateModelTemplate(packageName, table, fieldList)
  83. if err != nil {
  84. return err
  85. }
  86. modelTemplate.WithCache = redis
  87. err = generateSqlModel(force, modelTemplate)
  88. if err != nil {
  89. return err
  90. }
  91. }
  92. fmt.Println("model generate done ...")
  93. return nil
  94. }
  95. // 生成util model
  96. func generateUtilModel(force bool, data *Template) error {
  97. tl, err := template.New("").Parse(utilTemplateText)
  98. if err != nil {
  99. return err
  100. }
  101. fileName := "util.go"
  102. _, err = os.Stat(fileName)
  103. if err == nil {
  104. if !force {
  105. return nil
  106. }
  107. os.Remove(fileName)
  108. }
  109. file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, model.ModeDirPerm)
  110. if err != nil {
  111. return err
  112. }
  113. defer file.Close()
  114. err = tl.Execute(file, data)
  115. if err != nil {
  116. return err
  117. }
  118. cmd := exec.Command("goimports", "-w", fileName)
  119. err = cmd.Run()
  120. if err != nil {
  121. return err
  122. }
  123. return nil
  124. }
  125. // 生成sql对应model
  126. func generateSqlModel(force bool, data *Template) error {
  127. tl, err := template.New("").Parse(modelTemplateText)
  128. if err != nil {
  129. return err
  130. }
  131. fileName := strings.ToLower(data.ModelCamelWithLowerStart + "model.go")
  132. _, err = os.Stat(fileName)
  133. if err == nil {
  134. if !force {
  135. fmt.Println(fileName + " already exists")
  136. return nil
  137. }
  138. os.Remove(fileName)
  139. }
  140. file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0755)
  141. if err != nil {
  142. return err
  143. }
  144. defer file.Close()
  145. err = tl.Execute(file, data)
  146. if err != nil {
  147. return err
  148. }
  149. cmd := exec.Command("goimports", "-w", fileName)
  150. err = cmd.Run()
  151. if err != nil {
  152. return err
  153. }
  154. return nil
  155. }