command.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package command
  2. import (
  3. "errors"
  4. "path/filepath"
  5. "strings"
  6. "github.com/go-sql-driver/mysql"
  7. "github.com/tal-tech/go-zero/core/logx"
  8. "github.com/tal-tech/go-zero/core/stores/sqlx"
  9. "github.com/tal-tech/go-zero/tools/goctl/config"
  10. "github.com/tal-tech/go-zero/tools/goctl/model/sql/gen"
  11. "github.com/tal-tech/go-zero/tools/goctl/model/sql/model"
  12. "github.com/tal-tech/go-zero/tools/goctl/model/sql/util"
  13. "github.com/tal-tech/go-zero/tools/goctl/util/console"
  14. "github.com/urfave/cli"
  15. )
  16. const (
  17. flagSrc = "src"
  18. flagDir = "dir"
  19. flagCache = "cache"
  20. flagIdea = "idea"
  21. flagURL = "url"
  22. flagTable = "table"
  23. flagStyle = "style"
  24. flagDatabase = "database"
  25. )
  26. var errNotMatched = errors.New("sql not matched")
  27. // MysqlDDL generates model code from ddl
  28. func MysqlDDL(ctx *cli.Context) error {
  29. src := ctx.String(flagSrc)
  30. dir := ctx.String(flagDir)
  31. cache := ctx.Bool(flagCache)
  32. idea := ctx.Bool(flagIdea)
  33. style := ctx.String(flagStyle)
  34. database := ctx.String(flagDatabase)
  35. cfg, err := config.NewConfig(style)
  36. if err != nil {
  37. return err
  38. }
  39. return fromDDl(src, dir, cfg, cache, idea, database)
  40. }
  41. // MyDataSource generates model code from datasource
  42. func MyDataSource(ctx *cli.Context) error {
  43. url := strings.TrimSpace(ctx.String(flagURL))
  44. dir := strings.TrimSpace(ctx.String(flagDir))
  45. cache := ctx.Bool(flagCache)
  46. idea := ctx.Bool(flagIdea)
  47. style := ctx.String(flagStyle)
  48. pattern := strings.TrimSpace(ctx.String(flagTable))
  49. cfg, err := config.NewConfig(style)
  50. if err != nil {
  51. return err
  52. }
  53. return fromDataSource(url, pattern, dir, cfg, cache, idea)
  54. }
  55. func fromDDl(src, dir string, cfg *config.Config, cache, idea bool, database string) error {
  56. log := console.NewConsole(idea)
  57. src = strings.TrimSpace(src)
  58. if len(src) == 0 {
  59. return errors.New("expected path or path globbing patterns, but nothing found")
  60. }
  61. files, err := util.MatchFiles(src)
  62. if err != nil {
  63. return err
  64. }
  65. if len(files) == 0 {
  66. return errNotMatched
  67. }
  68. generator, err := gen.NewDefaultGenerator(dir, cfg, gen.WithConsoleOption(log))
  69. if err != nil {
  70. return err
  71. }
  72. for _, file := range files {
  73. err = generator.StartFromDDL(file, cache, database)
  74. if err != nil {
  75. return err
  76. }
  77. }
  78. return nil
  79. }
  80. func fromDataSource(url, pattern, dir string, cfg *config.Config, cache, idea bool) error {
  81. log := console.NewConsole(idea)
  82. if len(url) == 0 {
  83. log.Error("%v", "expected data source of mysql, but nothing found")
  84. return nil
  85. }
  86. if len(pattern) == 0 {
  87. log.Error("%v", "expected table or table globbing patterns, but nothing found")
  88. return nil
  89. }
  90. dsn, err := mysql.ParseDSN(url)
  91. if err != nil {
  92. return err
  93. }
  94. logx.Disable()
  95. databaseSource := strings.TrimSuffix(url, "/"+dsn.DBName) + "/information_schema"
  96. db := sqlx.NewMysql(databaseSource)
  97. im := model.NewInformationSchemaModel(db)
  98. tables, err := im.GetAllTables(dsn.DBName)
  99. if err != nil {
  100. return err
  101. }
  102. matchTables := make(map[string]*model.Table)
  103. for _, item := range tables {
  104. match, err := filepath.Match(pattern, item)
  105. if err != nil {
  106. return err
  107. }
  108. if !match {
  109. continue
  110. }
  111. columnData, err := im.FindColumns(dsn.DBName, item)
  112. if err != nil {
  113. return err
  114. }
  115. table, err := columnData.Convert()
  116. if err != nil {
  117. return err
  118. }
  119. matchTables[item] = table
  120. }
  121. if len(matchTables) == 0 {
  122. return errors.New("no tables matched")
  123. }
  124. generator, err := gen.NewDefaultGenerator(dir, cfg, gen.WithConsoleOption(log))
  125. if err != nil {
  126. return err
  127. }
  128. return generator.StartFromInformationSchema(matchTables, cache)
  129. }