Ich glaube, wir sind jetzt aus dem Schneider!
Wir haben festgestellt, dass wir neben notifications.id auch Spalten in anderen Tabellen migrieren mussten, die auf notification_id verwiesen. Andernfalls würden services/notifications.rb oder services/badge_granter.rb Fehler auslösen.
Für jedes andere große Forum-Setup, das in Zukunft auf dieses Problem mit Benachrichtigungen stößt, hier ist, was wir getan haben…
Insgesamt mussten wir vier Spalten in vier Tabellen migrieren:
notifications.id
user.seen_notification_id
user_badges.notification_id
shelved_notifications.notification_id
Wir haben zuerst #1 mit dem oben vorgeschlagenen ALTER-Befehl durchgeführt, aber dann, wie erwähnt, entschieden, ActiveRecord-Migrationen zu verwenden, damit die Migrationsdateien zum Schema hinzugefügt werden.
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
Wir haben in unserem Setup eine benutzerdefinierte Dockerfile (wir erstellen Images, damit wir Discourse und Sidekiq auf separaten Ressourcen in Kubernetes ausführen können), daher war das Kopieren dieser Dateien in /db/migrate als Teil unserer Dockerfile unkompliziert.
Dann ließen wir einfach rake db:migrate den Rest erledigen. Nachdem wir einen Rolling-Restart aller unserer Discourse- und Sidekiq-Pods durchgeführt hatten, lief alles wie erwartet
.