diff --git a/server/cmd/migrate/migration/init.go b/server/cmd/migrate/migration/init.go index a4f2a6b..f6dd0d1 100644 --- a/server/cmd/migrate/migration/init.go +++ b/server/cmd/migrate/migration/init.go @@ -32,6 +32,9 @@ func (e *Migration) SetDb(db *gorm.DB) { func (e *Migration) SetVersion(k string, f func(db *gorm.DB, version string) error) { e.mutex.Lock() defer e.mutex.Unlock() + if _, exists := e.version[k]; exists { + panic(fmt.Sprintf("duplicate migration version registered: %s", k)) + } e.version[k] = f } diff --git a/server/cmd/migrate/migration/init_test.go b/server/cmd/migrate/migration/init_test.go index 22f9330..176d566 100644 --- a/server/cmd/migrate/migration/init_test.go +++ b/server/cmd/migrate/migration/init_test.go @@ -1,6 +1,7 @@ package migration import ( + "fmt" "log" "os" "regexp" @@ -123,3 +124,19 @@ func TestMigrateRunsPendingVersions(t *testing.T) { t.Fatalf("汇总不对: %q", output) } } + +func TestSetVersionRejectsDuplicateRegistration(t *testing.T) { + migration := &Migration{version: map[string]func(*gorm.DB, string) error{}} + migration.SetVersion("0000000000001", func(*gorm.DB, string) error { return nil }) + + defer func() { + value := recover() + if value == nil { + t.Fatal("重复迁移版本不应静默覆盖") + } + if !strings.Contains(fmt.Sprint(value), "duplicate migration version registered: 0000000000001") { + t.Fatalf("重复版本错误不明确: %v", value) + } + }() + migration.SetVersion("0000000000001", func(*gorm.DB, string) error { return nil }) +} diff --git a/server/cmd/migrate/migration/version-local/1786701500000_syb_inner_code.go b/server/cmd/migrate/migration/version-local/1787884693633_syb_inner_code.go similarity index 100% rename from server/cmd/migrate/migration/version-local/1786701500000_syb_inner_code.go rename to server/cmd/migrate/migration/version-local/1787884693633_syb_inner_code.go