mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-07 16:16:37 +08:00
[优化] 修复数据库迁移问题
This commit is contained in:
@@ -123,10 +123,14 @@ func openDatabase() (*gorm.DB, string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func autoMigrateAll(db *gorm.DB) error {
|
func autoMigrateAll(db *gorm.DB) error {
|
||||||
for _, item := range registeredModels() {
|
models := registeredModels()
|
||||||
|
for i, item := range models {
|
||||||
|
name := fmt.Sprintf("%T", item)
|
||||||
|
slog.Info("autoMigrateAll: migrating model", "index", fmt.Sprintf("%d/%d", i+1, len(models)), "model", name)
|
||||||
if err := db.AutoMigrate(item); err != nil {
|
if err := db.AutoMigrate(item); err != nil {
|
||||||
return err
|
return fmt.Errorf("AutoMigrate %s failed: %w", name, err)
|
||||||
}
|
}
|
||||||
|
slog.Info("autoMigrateAll: migrated model", "model", name)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,7 +64,12 @@ func migrateV19(ctx Context, db *gorm.DB, backend string) error {
|
|||||||
slog.Info("dropped tunnel_id column from proxy_routes")
|
slog.Info("dropped tunnel_id column from proxy_routes")
|
||||||
}
|
}
|
||||||
|
|
||||||
return ctx.ApplyCurrentSchema(db, backend)
|
slog.Info("v19: starting ApplyCurrentSchema (auto-migrate all tables)")
|
||||||
|
if err := ctx.ApplyCurrentSchema(db, backend); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
slog.Info("v19: ApplyCurrentSchema completed")
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateV19(ctx Context, db *gorm.DB, backend string) error {
|
func validateV19(ctx Context, db *gorm.DB, backend string) error {
|
||||||
|
|||||||
@@ -38,15 +38,38 @@ func migrateV21(ctx Context, db *gorm.DB, backend string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Rename agent_version → version (target may already exist if AutoMigrate ran earlier)
|
||||||
if migrator.HasColumn(&nodeV21{}, "agent_version") {
|
if migrator.HasColumn(&nodeV21{}, "agent_version") {
|
||||||
if err := migrator.RenameColumn(&nodeV21{}, "agent_version", "version"); err != nil {
|
if migrator.HasColumn(&nodeV21{}, "version") {
|
||||||
return fmt.Errorf("failed to rename agent_version to version: %w", err)
|
// version already created by AutoMigrate with empty default; backfill from agent_version
|
||||||
|
slog.Info("v21: version column already exists, backfilling from agent_version")
|
||||||
|
if err := db.Exec(`UPDATE nodes SET version = agent_version WHERE version = ''`).Error; err != nil {
|
||||||
|
return fmt.Errorf("failed to backfill version from agent_version: %w", err)
|
||||||
|
}
|
||||||
|
if err := migrator.DropColumn(&nodeV21{}, "agent_version"); err != nil {
|
||||||
|
slog.Warn("failed to drop agent_version after backfill", "error", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := migrator.RenameColumn(&nodeV21{}, "agent_version", "version"); err != nil {
|
||||||
|
return fmt.Errorf("failed to rename agent_version to version: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Rename nginx_version → ext_version (target may already exist if AutoMigrate ran earlier)
|
||||||
if migrator.HasColumn(&nodeV21{}, "nginx_version") {
|
if migrator.HasColumn(&nodeV21{}, "nginx_version") {
|
||||||
if err := migrator.RenameColumn(&nodeV21{}, "nginx_version", "ext_version"); err != nil {
|
if migrator.HasColumn(&nodeV21{}, "ext_version") {
|
||||||
return fmt.Errorf("failed to rename nginx_version to ext_version: %w", err)
|
slog.Info("v21: ext_version column already exists, backfilling from nginx_version")
|
||||||
|
if err := db.Exec(`UPDATE nodes SET ext_version = nginx_version WHERE ext_version IS NULL OR ext_version = ''`).Error; err != nil {
|
||||||
|
return fmt.Errorf("failed to backfill ext_version from nginx_version: %w", err)
|
||||||
|
}
|
||||||
|
if err := migrator.DropColumn(&nodeV21{}, "nginx_version"); err != nil {
|
||||||
|
slog.Warn("failed to drop nginx_version after backfill", "error", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := migrator.RenameColumn(&nodeV21{}, "nginx_version", "ext_version"); err != nil {
|
||||||
|
return fmt.Errorf("failed to rename nginx_version to ext_version: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -184,21 +184,27 @@ func migrateObservabilityLegacyColumns(db *gorm.DB) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func applyCurrentSchema(db *gorm.DB, backend string) error {
|
func applyCurrentSchema(db *gorm.DB, backend string) error {
|
||||||
|
slog.Info("applyCurrentSchema: step 1/5 - auto migrate schema metadata")
|
||||||
if err := autoMigrateSchemaMetadata(db); err != nil {
|
if err := autoMigrateSchemaMetadata(db); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
slog.Info("applyCurrentSchema: step 2/5 - migrate proxy route https column")
|
||||||
if err := migrateProxyRouteEnableHTTPSColumn(db); err != nil {
|
if err := migrateProxyRouteEnableHTTPSColumn(db); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
slog.Info("applyCurrentSchema: step 3/5 - auto migrate all models")
|
||||||
if err := autoMigrateAll(db); err != nil {
|
if err := autoMigrateAll(db); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
slog.Info("applyCurrentSchema: step 4/5 - migrate text columns")
|
||||||
if err := migrateTextColumns(db, backend); err != nil {
|
if err := migrateTextColumns(db, backend); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
slog.Info("applyCurrentSchema: step 5/5 - migrate observability legacy columns")
|
||||||
if err := migrateObservabilityLegacyColumns(db); err != nil {
|
if err := migrateObservabilityLegacyColumns(db); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
slog.Info("applyCurrentSchema: completed")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ type Node struct {
|
|||||||
UpdateChannel string `json:"update_channel" gorm:"size:16;not null;default:'stable'"`
|
UpdateChannel string `json:"update_channel" gorm:"size:16;not null;default:'stable'"`
|
||||||
UpdateTag string `json:"update_tag" gorm:"size:64"`
|
UpdateTag string `json:"update_tag" gorm:"size:64"`
|
||||||
RestartOpenrestyRequested bool `json:"restart_openresty_requested" gorm:"not null;default:false"`
|
RestartOpenrestyRequested bool `json:"restart_openresty_requested" gorm:"not null;default:false"`
|
||||||
Version string `json:"version" gorm:"size:64;not null"`
|
Version string `json:"version" gorm:"size:64;not null;default:''"`
|
||||||
ExtVersion string `json:"ext_version" gorm:"size:64"`
|
ExtVersion string `json:"ext_version" gorm:"size:64"`
|
||||||
OpenrestyStatus string `json:"openresty_status" gorm:"size:16;not null;default:'unknown'"`
|
OpenrestyStatus string `json:"openresty_status" gorm:"size:16;not null;default:'unknown'"`
|
||||||
OpenrestyMessage string `json:"openresty_message" gorm:"type:text"`
|
OpenrestyMessage string `json:"openresty_message" gorm:"type:text"`
|
||||||
|
|||||||
Reference in New Issue
Block a user