@@ -127,6 +127,9 @@ func triggerMigrations(ctx context.Context, db *gorm.DB) error {
127127 if err := migrationAddRoutingEngineUsedColumn (ctx , db ); err != nil {
128128 return err
129129 }
130+ if err := migrationAddRoutingEnginesUsedColumn (ctx , db ); err != nil {
131+ return err
132+ }
130133 return nil
131134}
132135
@@ -1060,8 +1063,10 @@ func migrationAddRoutingEngineUsedColumn(ctx context.Context, db *gorm.DB) error
10601063 Migrate : func (tx * gorm.DB ) error {
10611064 tx = tx .WithContext (ctx )
10621065 migrator := tx .Migrator ()
1063- if ! migrator .HasColumn (& Log {}, "routing_engine_used" ) {
1064- if err := migrator .AddColumn (& Log {}, "routing_engine_used" ); err != nil {
1066+ // Only add the column if it doesn't exist
1067+ if ! migrator .HasColumn (& Log {}, "routing_engine_used" ) && ! migrator .HasColumn (& Log {}, "routing_engines_used" ) {
1068+ // Use raw SQL to avoid GORM struct field dependency
1069+ if err := tx .Exec ("ALTER TABLE logs ADD COLUMN routing_engine_used VARCHAR(255)" ).Error ; err != nil {
10651070 return err
10661071 }
10671072 }
@@ -1084,3 +1089,52 @@ func migrationAddRoutingEngineUsedColumn(ctx context.Context, db *gorm.DB) error
10841089 }
10851090 return nil
10861091}
1092+
1093+ func migrationAddRoutingEnginesUsedColumn (ctx context.Context , db * gorm.DB ) error {
1094+ opts := * migrator .DefaultOptions
1095+ opts .UseTransaction = true
1096+ m := migrator .New (db , & opts , []* migrator.Migration {{
1097+ ID : "logs_add_routing_engines_used_column" ,
1098+ Migrate : func (tx * gorm.DB ) error {
1099+ tx = tx .WithContext (ctx )
1100+ migrator := tx .Migrator ()
1101+
1102+ hasOldColumn := migrator .HasColumn (& Log {}, "routing_engine_used" )
1103+ hasNewColumn := migrator .HasColumn (& Log {}, "routing_engines_used" )
1104+
1105+ if hasOldColumn && ! hasNewColumn {
1106+ // Rename old column to new if new doesn't exist yet
1107+ if err := migrator .RenameColumn (& Log {}, "routing_engine_used" , "routing_engines_used" ); err != nil {
1108+ return fmt .Errorf ("failed to rename routing_engine_used to routing_engines_used: %w" , err )
1109+ }
1110+ } else if hasOldColumn && hasNewColumn {
1111+ // Both columns exist - drop the old one (new column is already in use)
1112+ if err := migrator .DropColumn (& Log {}, "routing_engine_used" ); err != nil {
1113+ return fmt .Errorf ("failed to drop old routing_engine_used column: %w" , err )
1114+ }
1115+ }
1116+ // If only new column exists, do nothing (already migrated)
1117+
1118+ return nil
1119+ },
1120+ Rollback : func (tx * gorm.DB ) error {
1121+ tx = tx .WithContext (ctx )
1122+ migrator := tx .Migrator ()
1123+
1124+ hasNewColumn := migrator .HasColumn (& Log {}, "routing_engines_used" )
1125+ hasOldColumn := migrator .HasColumn (& Log {}, "routing_engine_used" )
1126+
1127+ if hasNewColumn && ! hasOldColumn {
1128+ // Rename new column back to old if old doesn't exist
1129+ if err := migrator .RenameColumn (& Log {}, "routing_engines_used" , "routing_engine_used" ); err != nil {
1130+ return fmt .Errorf ("failed to rename routing_engines_used back to routing_engine_used: %w" , err )
1131+ }
1132+ }
1133+ // If old column was dropped, recreate it would be complex, so we skip
1134+
1135+ return nil
1136+ },
1137+ }})
1138+
1139+ return m .Migrate ()
1140+ }
0 commit comments