5.rename_env_groups_to_namespaces.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package migrate
  2. import (
  3. "github.com/0xJacky/Nginx-UI/model"
  4. "github.com/go-gormigrate/gormigrate/v2"
  5. "gorm.io/gorm"
  6. )
  7. var RenameEnvGroupsToNamespaces = &gormigrate.Migration{
  8. ID: "20250812000001",
  9. Migrate: func(tx *gorm.DB) error {
  10. // 检查 env_groups 表是否存在
  11. if !tx.Migrator().HasTable("env_groups") {
  12. // 如果 env_groups 表不存在,说明已经迁移过了或者是新安装
  13. return nil
  14. }
  15. // 检查 namespaces 表是否存在
  16. if !tx.Migrator().HasTable("namespaces") {
  17. // namespaces 表不存在,直接重命名
  18. if err := tx.Exec("ALTER TABLE env_groups RENAME TO namespaces").Error; err != nil {
  19. return err
  20. }
  21. } else {
  22. // namespaces 表已存在,迁移数据后删除旧表
  23. // 使用 GORM 查询和创建来迁移数据
  24. var envGroups []model.Namespace
  25. if err := tx.Table("env_groups").Find(&envGroups).Error; err != nil {
  26. return err
  27. }
  28. // 为每个 env_group 创建对应的 namespace
  29. for _, envGroup := range envGroups {
  30. // 设置默认值
  31. if envGroup.Name == "" {
  32. envGroup.Name = "Default"
  33. }
  34. if envGroup.PostSyncAction == "" {
  35. envGroup.PostSyncAction = "reload_nginx"
  36. }
  37. if envGroup.UpstreamTestType == "" {
  38. envGroup.UpstreamTestType = "local"
  39. }
  40. // 使用 FirstOrCreate 避免重复插入
  41. var existingNamespace model.Namespace
  42. if err := tx.Where("id = ?", envGroup.ID).FirstOrCreate(&existingNamespace, &envGroup).Error; err != nil {
  43. return err
  44. }
  45. }
  46. // 删除旧表
  47. if err := tx.Migrator().DropTable("env_groups"); err != nil {
  48. return err
  49. }
  50. }
  51. // 更新 sites 表中的外键字段
  52. if tx.Migrator().HasColumn("sites", "env_group_id") {
  53. // 添加新列(如果不存在)
  54. if !tx.Migrator().HasColumn("sites", "namespace_id") {
  55. if err := tx.Exec("ALTER TABLE sites ADD COLUMN namespace_id BIGINT").Error; err != nil {
  56. return err
  57. }
  58. }
  59. // 复制数据
  60. if err := tx.Exec("UPDATE sites SET namespace_id = env_group_id WHERE namespace_id IS NULL OR namespace_id = 0").Error; err != nil {
  61. return err
  62. }
  63. }
  64. // 更新 streams 表中的外键字段
  65. if tx.Migrator().HasColumn("streams", "env_group_id") {
  66. // 添加新列(如果不存在)
  67. if !tx.Migrator().HasColumn("streams", "namespace_id") {
  68. if err := tx.Exec("ALTER TABLE streams ADD COLUMN namespace_id BIGINT").Error; err != nil {
  69. return err
  70. }
  71. }
  72. // 复制数据
  73. if err := tx.Exec("UPDATE streams SET namespace_id = env_group_id WHERE namespace_id IS NULL OR namespace_id = 0").Error; err != nil {
  74. return err
  75. }
  76. }
  77. // 更新 configs 表中的外键字段(如果存在)
  78. if tx.Migrator().HasColumn("configs", "env_group_id") {
  79. // 添加新列(如果不存在)
  80. if !tx.Migrator().HasColumn("configs", "namespace_id") {
  81. if err := tx.Exec("ALTER TABLE configs ADD COLUMN namespace_id BIGINT").Error; err != nil {
  82. return err
  83. }
  84. }
  85. // 复制数据
  86. if err := tx.Exec("UPDATE configs SET namespace_id = env_group_id WHERE namespace_id IS NULL OR namespace_id = 0").Error; err != nil {
  87. return err
  88. }
  89. }
  90. return nil
  91. },
  92. }