Quellcode durchsuchen

🐛 fix(db): rename composite unique indexes to avoid drop/recreate on restart

- Model: rename `uk_model_name` -> `uk_model_name_delete_at`
  (composite on `model_name` + `deleted_at`)
- Vendor: rename `uk_vendor_name` -> `uk_vendor_name_delete_at`
  (composite on `name` + `deleted_at`)
- Keep legacy cleanup in `model/main.go` to drop old index names
  (`uk_model_name`, `model_name`, `uk_vendor_name`, `name`) for compatibility.

Result: idempotent GORM migrations and no unnecessary index churn on MySQL restarts.

Files:
- `model/model_meta.go`
- `model/vendor_meta.go`
t0ng7u vor 6 Monaten
Ursprung
Commit
9127449a7a
3 geänderte Dateien mit 10 neuen und 9 gelöschten Zeilen
  1. 6 5
      model/main.go
  2. 2 2
      model/model_meta.go
  3. 2 2
      model/vendor_meta.go

+ 6 - 5
model/main.go

@@ -270,9 +270,9 @@ func migrateDB() error {
 
 	dropIndexIfExists("vendors", "uk_vendor_name") // 新版复合索引名称(若已存在)
 	dropIndexIfExists("vendors", "name")           // 旧版列级唯一索引名称
-	//if !common.UsingPostgreSQL {
-	//	return migrateDBFast()
-	//}
+	// 清理旧索引名(兼容历史),避免与新的复合唯一索引冲突
+	// 说明:仅清理旧名 uk_model_name/model_name、uk_vendor_name/name;新索引名 uk_model_name_delete_at/uk_vendor_name_delete_at 不在清理范围
+	// 计划:该兼容逻辑将在后续几个版本中移除
 	err := DB.AutoMigrate(
 		&Channel{},
 		&Token{},
@@ -299,8 +299,9 @@ func migrateDB() error {
 }
 
 func migrateDBFast() error {
-	// 修复旧版本留下的唯一索引,允许软删除后重新插入同名记录
-	// 删除单列唯一索引(列级 UNIQUE)及早期命名方式,防止与新复合唯一索引冲突
+	// 清理旧索引名(兼容历史),允许软删除后重新插入同名记录
+	// 说明:仅清理旧名 uk_model_name/model_name、uk_vendor_name/name;新索引名 uk_model_name_delete_at/uk_vendor_name_delete_at 不在清理范围
+	// 计划:该兼容逻辑将在后续几个版本中移除
 	dropIndexIfExists("models", "uk_model_name")
 	dropIndexIfExists("models", "model_name")
 

+ 2 - 2
model/model_meta.go

@@ -21,7 +21,7 @@ type BoundChannel struct {
 
 type Model struct {
 	Id          int            `json:"id"`
-	ModelName   string         `json:"model_name" gorm:"size:128;not null;uniqueIndex:uk_model_name,priority:1"`
+	ModelName   string         `json:"model_name" gorm:"size:128;not null;uniqueIndex:uk_model_name_delete_at,priority:1"`
 	Description string         `json:"description,omitempty" gorm:"type:text"`
 	Icon        string         `json:"icon,omitempty" gorm:"type:varchar(128)"`
 	Tags        string         `json:"tags,omitempty" gorm:"type:varchar(255)"`
@@ -30,7 +30,7 @@ type Model struct {
 	Status      int            `json:"status" gorm:"default:1"`
 	CreatedTime int64          `json:"created_time" gorm:"bigint"`
 	UpdatedTime int64          `json:"updated_time" gorm:"bigint"`
-	DeletedAt   gorm.DeletedAt `json:"-" gorm:"index;uniqueIndex:uk_model_name,priority:2"`
+	DeletedAt   gorm.DeletedAt `json:"-" gorm:"index;uniqueIndex:uk_model_name_delete_at,priority:2"`
 
 	BoundChannels []BoundChannel `json:"bound_channels,omitempty" gorm:"-"`
 	EnableGroups  []string       `json:"enable_groups,omitempty" gorm:"-"`

+ 2 - 2
model/vendor_meta.go

@@ -14,13 +14,13 @@ import (
 
 type Vendor struct {
 	Id          int            `json:"id"`
-	Name        string         `json:"name" gorm:"size:128;not null;uniqueIndex:uk_vendor_name,priority:1"`
+	Name        string         `json:"name" gorm:"size:128;not null;uniqueIndex:uk_vendor_name_delete_at,priority:1"`
 	Description string         `json:"description,omitempty" gorm:"type:text"`
 	Icon        string         `json:"icon,omitempty" gorm:"type:varchar(128)"`
 	Status      int            `json:"status" gorm:"default:1"`
 	CreatedTime int64          `json:"created_time" gorm:"bigint"`
 	UpdatedTime int64          `json:"updated_time" gorm:"bigint"`
-	DeletedAt   gorm.DeletedAt `json:"-" gorm:"index;uniqueIndex:uk_vendor_name,priority:2"`
+	DeletedAt   gorm.DeletedAt `json:"-" gorm:"index;uniqueIndex:uk_vendor_name_delete_at,priority:2"`
 }
 
 // Insert 创建新的供应商记录