Errore: intero fuori intervallo

Penso che ora siamo fuori pericolo!

Abbiamo notato che era necessario migrare le colonne in altre tabelle che facevano riferimento a notification_id oltre a notifications.id stesso. Altrimenti, services/notifications.rb o services/badge_granter.rb avrebbero generato errori.


Per qualsiasi altro grande setup di forum che si imbatta in questo in futuro con le notifiche, ecco cosa abbiamo fatto…

In totale, abbiamo dovuto migrare quattro colonne in quattro tabelle:

  1. notifications.id
  2. user.seen_notification_id
  3. user_badges.notification_id
  4. shelved_notifications.notification_id

Inizialmente abbiamo proceduto con il comando ALTER suggerito sopra per il punto 1, ma poi, come menzionato, abbiamo optato per utilizzare le migrazioni ActiveRecord, in modo che i file di migrazione si aggiungano allo schema.

20230215070319_change_notifications_id_to_bigint.rb
# frozen_string_literal: true

class ChangeNotificationsIdToBigint < ActiveRecord::Migration[6.1]
    def change
        change_column :notifications, :id, :bigint
    end
end
20230215070320_change_user_seen_notification_id_to_bigint.rb
# frozen_string_literal: true

class ChangeUserSeenNotificationIdToBigint < ActiveRecord::Migration[6.1]
    def change
        change_column :users, :seen_notification_id, :bigint
    end
end
20230215070321_change_user_badges_notification_id_to_bigint.rb
# frozen_string_literal: true

class ChangeUserBadgesNotificationIdToBigint < ActiveRecord::Migration[6.1]
    def change
        change_column :user_badges, :notification_id, :bigint
    end
end
20230215070322_change_shelved_notifications_notification_id_to_bigint.rb
# frozen_string_literal: true

class ChangeShelvedNotificationsNotificationIdToBigint < ActiveRecord::Migration[6.1]
    def change
        change_column :shelved_notifications, :notification_id, :bigint
    end
end

Abbiamo un Dockerfile personalizzato nel nostro setup (costruiamo immagini in modo da poter eseguire discourse e sidekiq su risorse separate in Kubernetes), quindi copiare questi file in /db/migrate come parte del nostro Dockerfile è stato semplice.

Poi, abbiamo semplicemente lasciato che rake db:migrate facesse il resto. Una volta eseguito un riavvio graduale di tutti i nostri pod discourse e sidekiq, tutto funzionava come previsto :crossed_fingers:.

3 Mi Piace