2
0

sys_initdb_pgsql.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package system
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "path/filepath"
  7. "github.com/flipped-aurora/gin-vue-admin/server/config"
  8. "github.com/gookit/color"
  9. "github.com/flipped-aurora/gin-vue-admin/server/utils"
  10. "github.com/flipped-aurora/gin-vue-admin/server/global"
  11. "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
  12. "github.com/google/uuid"
  13. "gorm.io/driver/postgres"
  14. "gorm.io/gorm"
  15. )
  16. type PgsqlInitHandler struct{}
  17. func NewPgsqlInitHandler() *PgsqlInitHandler {
  18. return &PgsqlInitHandler{}
  19. }
  20. // WriteConfig pgsql 回写配置
  21. func (h PgsqlInitHandler) WriteConfig(ctx context.Context) error {
  22. c, ok := ctx.Value("config").(config.Pgsql)
  23. if !ok {
  24. return errors.New("postgresql config invalid")
  25. }
  26. global.GVA_CONFIG.System.DbType = "pgsql"
  27. global.GVA_CONFIG.Pgsql = c
  28. global.GVA_CONFIG.JWT.SigningKey = uuid.New().String()
  29. cs := utils.StructToMap(global.GVA_CONFIG)
  30. for k, v := range cs {
  31. global.GVA_VP.Set(k, v)
  32. }
  33. global.GVA_ACTIVE_DBNAME = &c.Dbname
  34. return global.GVA_VP.WriteConfig()
  35. }
  36. // EnsureDB 创建数据库并初始化 pg
  37. func (h PgsqlInitHandler) EnsureDB(ctx context.Context, conf *request.InitDB) (next context.Context, err error) {
  38. if s, ok := ctx.Value("dbtype").(string); !ok || s != "pgsql" {
  39. return ctx, ErrDBTypeMismatch
  40. }
  41. c := conf.ToPgsqlConfig()
  42. next = context.WithValue(ctx, "config", c)
  43. if c.Dbname == "" {
  44. return ctx, nil
  45. } // 如果没有数据库名, 则跳出初始化数据
  46. dsn := conf.PgsqlEmptyDsn()
  47. var createSql string
  48. if conf.Template != "" {
  49. createSql = fmt.Sprintf("CREATE DATABASE %s WITH TEMPLATE %s;", c.Dbname, conf.Template)
  50. } else {
  51. createSql = fmt.Sprintf("CREATE DATABASE %s;", c.Dbname)
  52. }
  53. if err = createDatabase(dsn, "pgx", createSql); err != nil {
  54. return nil, err
  55. } // 创建数据库
  56. var db *gorm.DB
  57. if db, err = gorm.Open(postgres.New(postgres.Config{
  58. DSN: c.Dsn(), // DSN data source name
  59. PreferSimpleProtocol: false,
  60. }), &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true}); err != nil {
  61. return ctx, err
  62. }
  63. global.GVA_CONFIG.AutoCode.Root, _ = filepath.Abs("..")
  64. next = context.WithValue(next, "db", db)
  65. return next, err
  66. }
  67. func (h PgsqlInitHandler) InitTables(ctx context.Context, inits initSlice) error {
  68. return createTables(ctx, inits)
  69. }
  70. func (h PgsqlInitHandler) InitData(ctx context.Context, inits initSlice) error {
  71. next, cancel := context.WithCancel(ctx)
  72. defer func(c func()) { c() }(cancel)
  73. for i := 0; i < len(inits); i++ {
  74. if inits[i].DataInserted(next) {
  75. color.Info.Printf(InitDataExist, Pgsql, inits[i].InitializerName())
  76. continue
  77. }
  78. if n, err := inits[i].InitializeData(next); err != nil {
  79. color.Info.Printf(InitDataFailed, Pgsql, inits[i].InitializerName(), err)
  80. return err
  81. } else {
  82. next = n
  83. color.Info.Printf(InitDataSuccess, Pgsql, inits[i].InitializerName())
  84. }
  85. }
  86. color.Info.Printf(InitSuccess, Pgsql)
  87. return nil
  88. }