command.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package command
  2. import (
  3. "errors"
  4. "io/ioutil"
  5. "path/filepath"
  6. "strings"
  7. "github.com/go-sql-driver/mysql"
  8. "github.com/tal-tech/go-zero/core/logx"
  9. "github.com/tal-tech/go-zero/core/stores/sqlx"
  10. "github.com/tal-tech/go-zero/tools/goctl/config"
  11. "github.com/tal-tech/go-zero/tools/goctl/model/sql/gen"
  12. "github.com/tal-tech/go-zero/tools/goctl/model/sql/model"
  13. "github.com/tal-tech/go-zero/tools/goctl/model/sql/util"
  14. "github.com/tal-tech/go-zero/tools/goctl/util/console"
  15. "github.com/urfave/cli"
  16. )
  17. var errNotMatched = errors.New("sql not matched")
  18. const (
  19. flagSrc = "src"
  20. flagDir = "dir"
  21. flagCache = "cache"
  22. flagIdea = "idea"
  23. flagUrl = "url"
  24. flagTable = "table"
  25. flagStyle = "style"
  26. )
  27. func MysqlDDL(ctx *cli.Context) error {
  28. src := ctx.String(flagSrc)
  29. dir := ctx.String(flagDir)
  30. cache := ctx.Bool(flagCache)
  31. idea := ctx.Bool(flagIdea)
  32. style := ctx.String(flagStyle)
  33. cfg, err := config.NewConfig(style)
  34. if err != nil {
  35. return err
  36. }
  37. return fromDDl(src, dir, cfg, cache, idea)
  38. }
  39. func MyDataSource(ctx *cli.Context) error {
  40. url := strings.TrimSpace(ctx.String(flagUrl))
  41. dir := strings.TrimSpace(ctx.String(flagDir))
  42. cache := ctx.Bool(flagCache)
  43. idea := ctx.Bool(flagIdea)
  44. style := ctx.String(flagStyle)
  45. pattern := strings.TrimSpace(ctx.String(flagTable))
  46. cfg, err := config.NewConfig(style)
  47. if err != nil {
  48. return err
  49. }
  50. return fromDataSource(url, pattern, dir, cfg, cache, idea)
  51. }
  52. func fromDDl(src, dir string, cfg *config.Config, cache, idea bool) error {
  53. log := console.NewConsole(idea)
  54. src = strings.TrimSpace(src)
  55. if len(src) == 0 {
  56. return errors.New("expected path or path globbing patterns, but nothing found")
  57. }
  58. files, err := util.MatchFiles(src)
  59. if err != nil {
  60. return err
  61. }
  62. if len(files) == 0 {
  63. return errNotMatched
  64. }
  65. var source []string
  66. for _, file := range files {
  67. data, err := ioutil.ReadFile(file)
  68. if err != nil {
  69. return err
  70. }
  71. source = append(source, string(data))
  72. }
  73. generator, err := gen.NewDefaultGenerator(dir, cfg, gen.WithConsoleOption(log))
  74. if err != nil {
  75. return err
  76. }
  77. err = generator.StartFromDDL(strings.Join(source, "\n"), cache)
  78. return err
  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.Column)
  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. columns, err := im.FindByTableName(dsn.DBName, item)
  112. if err != nil {
  113. return err
  114. }
  115. matchTables[item] = columns
  116. }
  117. if len(matchTables) == 0 {
  118. return errors.New("no tables matched")
  119. }
  120. generator, err := gen.NewDefaultGenerator(dir, cfg, gen.WithConsoleOption(log))
  121. if err != nil {
  122. return err
  123. }
  124. err = generator.StartFromInformationSchema(dsn.DBName, matchTables, cache)
  125. return err
  126. }