gen_service.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package services
  2. import (
  3. "flag"
  4. "fmt"
  5. "github.com/pkg/errors"
  6. "gorm.io/driver/mysql"
  7. "gorm.io/gen"
  8. "gorm.io/gorm"
  9. "gorm.io/gorm/logger"
  10. "jollia.cn/jolib/jokode"
  11. "jollia.cn/jolib/jokode/log"
  12. "strings"
  13. )
  14. const (
  15. defCfgFilePath = "conf/db.yaml"
  16. )
  17. type GenService struct {
  18. dbInstance *gorm.DB
  19. }
  20. func (s *GenService) Init() error {
  21. log.Warn("Enter: GenService.Init")
  22. defer log.Warn("Leave: GenService.Init")
  23. if !flag.Parsed() {
  24. flag.Parse()
  25. }
  26. var (
  27. dbCfg *DbConfig
  28. cfgFilePath string
  29. force bool
  30. )
  31. if cfgFilePathFlag != "" {
  32. cfgFilePath = cfgFilePathFlag
  33. force = true
  34. } else {
  35. cfgFilePath = defCfgFilePath
  36. force = false
  37. }
  38. if cfg, err := loadConfigFromFile(cfgFilePath, force); err != nil {
  39. return errors.Wrapf(err, "try load db config from file '%s' fail", cfgFilePath)
  40. } else if cfg == nil {
  41. return errors.New("load db config returns nil")
  42. } else {
  43. dbCfg = cfg
  44. }
  45. if !dbConfigFlag.IsZero() {
  46. if dbConfigFlag.Host != "" {
  47. dbCfg.Host = dbConfigFlag.Host
  48. }
  49. if dbConfigFlag.Port != 0 {
  50. dbCfg.Port = dbConfigFlag.Port
  51. }
  52. if dbConfigFlag.Schema != "" {
  53. dbCfg.Schema = dbConfigFlag.Schema
  54. }
  55. if dbConfigFlag.User != "" {
  56. dbCfg.User = dbConfigFlag.User
  57. }
  58. if dbConfigFlag.Pwd != "" {
  59. dbCfg.Pwd = dbConfigFlag.Pwd
  60. }
  61. }
  62. if err := s.initDatabase(dbCfg); err != nil {
  63. return errors.Wrap(err, "try init database fail")
  64. }
  65. return nil
  66. }
  67. func (s *GenService) initDatabase(dbCfg *DbConfig) error {
  68. if dbCfg == nil {
  69. return errors.New("can not init database with nil db config")
  70. }
  71. if err := dbCfg.FixDefaultValues(); err != nil {
  72. return errors.Wrap(err, "try fix default values of database config fail")
  73. }
  74. dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
  75. dbCfg.User,
  76. dbCfg.Pwd,
  77. dbCfg.Host,
  78. dbCfg.Port,
  79. dbCfg.Schema)
  80. if db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
  81. Logger: logger.Default.LogMode(logger.Info),
  82. }); err != nil {
  83. return errors.Wrapf(err, "try open database with dsn '%s' fail", dsn)
  84. } else {
  85. s.dbInstance = db
  86. }
  87. return nil
  88. }
  89. func loadConfigFromFile(filePath string, force bool) (*DbConfig, error) {
  90. cfg := &DbConfig{}
  91. if err := jokode.LoadConfigFromFile(cfg, filePath); err != nil {
  92. if force {
  93. return nil, errors.Wrapf(err, "try load config from file '%s' fail", filePath)
  94. }
  95. }
  96. return cfg, nil
  97. }
  98. func (s *GenService) Start() error {
  99. log.Warn("Enter: GenService.Start")
  100. defer log.Warn("Leave: GenService.Start")
  101. if s.dbInstance == nil {
  102. return errors.New("try start gen service with nil database instance")
  103. }
  104. g := gen.NewGenerator(gen.Config{
  105. //OutPath: "po",
  106. //OutFile: "po",
  107. //ModelPkgPath: "po",
  108. WithUnitTest: false,
  109. FieldNullable: true,
  110. FieldCoverable: true,
  111. FieldSignable: true,
  112. FieldWithIndexTag: true,
  113. FieldWithTypeTag: true,
  114. Mode: gen.WithDefaultQuery | gen.WithQueryInterface,
  115. })
  116. g.WithDataTypeMap(map[string]func(columnType gorm.ColumnType) (dataType string){
  117. "tinyint": func(filedType gorm.ColumnType) string {
  118. if ct, ok := filedType.ColumnType(); ok {
  119. if strings.HasPrefix(strings.ToLower(ct), "tinyint(1)") {
  120. return "int8"
  121. }
  122. return "int16"
  123. } else {
  124. return "int32"
  125. }
  126. },
  127. })
  128. g.UseDB(s.dbInstance)
  129. g.GenerateAllTable()
  130. g.Execute()
  131. return nil
  132. }
  133. func (s *GenService) Stop() {
  134. // do nothing
  135. }
  136. func (s *GenService) GetName() string {
  137. return "GenService"
  138. }
  139. func (s *GenService) GetInitOrder() int {
  140. return 0
  141. }