Erro: inteiro fora do intervalo

Acho que agora estamos livres!

Percebemos que precisávamos migrar colunas em outras tabelas que referenciavam notification_id além de notifications.id. Caso contrário, services/notifications.rb ou services/badge_granter.rb lançariam erros.


Para qualquer outra configuração de grande fórum que encontrar isso no futuro com notificações, aqui está o que fizemos…

No total, tivemos que migrar quatro colunas em quatro tabelas:

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

Inicialmente, fizemos o item nº 1 com o comando ALTER sugerido acima, mas depois, como mencionado, optamos por usar migrações ActiveRecord, para que os arquivos de migração se somem ao esquema.

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

Temos um Dockerfile personalizado em nossa configuração (construímos imagens para que possamos executar discourse e sidekiq em recursos separados no Kubernetes), então fazer com que esses arquivos sejam copiados para /db/migrate como parte de nosso Dockerfile foi simples.

Em seguida, apenas deixamos rake db:migrate cuidar do resto. Assim que fizemos uma reinicialização gradual de todos os nossos pods de discourse e sidekiq, tudo estava funcionando como esperado :crossed_fingers:.

3 curtidas