PG::UndefinedTable: ERROR: relation "voice_rooms" does not exist

Fatal: could not read Username for 'https://github.com' のディスカッションを続けます:

GitHubの問題は解決したと思いますが、アップグレードが失敗します。これが最初のエラーです:

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled: (StandardError) 
PG::UndefinedTable: ERROR:  relation "voice_rooms" does not exist

2コンテナ構成です(data も実行しましたが、エラーはありません)。また、最新版を使用しています。

何か手がかりはありますか?

PG::UndefinedTable: ERROR: relation "voice_rooms" does not exist が表示されるのは、新しいコア同梱の voice プラグインのマイグレーションがまだ実行されていないためです。

rake aborted! の上には何と表示されていましたか?

うーん… たくさんあるけど :laughing: でも、特に気になるものはないかな。

x86_64 アーキテクチャを検出しました。                                                                                                                                                 
ランチャーが最新であることを確認中                                                                                                                                       
ランチャーは最新です                                                                                                                                                
古いコンテナを停止中                                                                                                                                                
+ /usr/bin/docker stop -t 600 web_only                                                                                                                                
web_only                                                                                                                                                              
2.0.20260812-0036: discourse/base からプル中                                                                                                                        
Digest: sha256:837e8ed4b5916baa36856b842ad84fe262b6b1b5550701f8844b13cc7acad7a5                                                                                       
Status: discourse/base:2.0.20260812-0036 のイメージは最新です                                                                                                      
docker.io/discourse/base:2.0.20260812-0036                                                                                                                            
/usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups.rb                                                                                                            
/usr/local/bin/pups --stdin                                                                                                                                           
I, [2026-09-03T08:55:23.418621 #1]  INFO -- : stdin から読み取り中                                                                                                      
I, [2026-09-03T08:55:23.453117 #1]  INFO -- : > thpoff echo "thpoff is installed!"                                                                                    
thpoff is installed!                                                                                                                                                  
I, [2026-09-03T08:55:23.461963 #1]  INFO -- : > /usr/local/bin/ruby -e 'if (ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com" && ENV["DISCOURSE_SKIP_EMAIL_SETUP"] !
= "1"); puts "Aborting! Mail is not configured!"; exit 1; end'                                                                                                        
I, [2026-09-03T08:55:23.608522 #1]  INFO -- : > /usr/local/bin/ruby -e 'if ENV["DISCOURSE_HOSTNAME"] == "discourse.example.com"; puts "Aborting! Domain is not configu
red!"; exit 1; end'                                                                                                                                                   
I, [2026-09-03T08:55:23.743204 #1]  INFO -- : > /usr/local/bin/ruby -e 'if (ENV["DISCOURSE_CDN_URL"] || "")[0..1] == "//"; puts "Aborting! CDN must have a protocol sp
eccified"

以前のresenhaプラグインのマイグレーションバージョンが、新しいvoiceプラグインのものと一致していることが原因ではないかと推測しています。おそらく、先にインストールしたためではないでしょうか?

もし確信が持てない場合は、psqlで以下のコマンドを実行してみてください:

  SELECT version, name, direction, created_at, git_version
  FROM schema_migration_details
  WHERE version = '20241107000000'
  ORDER BY created_at;

resenha/db/migrate/20241107000000_create_resenha_rooms.rb at b87ca4e20d649ba6b7bdc4615b289c414854889e · xfalcox/resenha · GitHubdiscourse/plugins/voice/db/migrate/20241107000000_create_voice_rooms.rb at main · discourse/discourse · GitHub をご覧ください。

この競合するマイグレーションバージョンについては、コア側の修正が必要になるはずです。おそらく他のプラグインにも影響が出ていると考えられます。続報をお待ちください。

はい、初期の段階では試したんですが、後で削除しました。

おそらく、実行されると想定されていた Resenha のマイグレーションが実際には実行されていなかったのだと思います。コアのボイス機能でも同じマイグレーションバージョン番号が使用されているため、突然 voice_rooms にカラムを追加しようとすると、テーブル名がまだ resenha_rooms のままなので動作しません。

とりあえず、psql でこれを実行してみてください:

DO
$$
  DECLARE
    has_resenha boolean;
    has_voice   boolean;
    table_pair  record;
  BEGIN
    SELECT EXISTS (SELECT 1
                   FROM unnest(ARRAY [
                     'resenha_rooms',
                     'resenha_room_memberships',
                     'resenha_sessions',
                     'resenha_co_presences',
                     'resenha_recordings',
                     'resenha_invites'
                     ]) AS names(name)
                   WHERE to_regclass(format('public.%I', name)) IS NOT NULL)
    INTO has_resenha;

    SELECT EXISTS (SELECT 1
                   FROM unnest(ARRAY [
                     'voice_rooms',
                     'voice_room_memberships',
                     'voice_sessions',
                     'voice_co_presences',
                     'voice_recordings',
                     'voice_invites'
                     ]) AS names(name)
                   WHERE to_regclass(format('public.%I', name)) IS NOT NULL)
    INTO has_voice;

    IF has_resenha AND has_voice THEN
      RAISE EXCEPTION
        'Both Resenha and Voice tables exist. Nothing was changed.';
    END IF;

    IF NOT has_resenha THEN
      IF to_regclass('public.voice_rooms') IS NOT NULL THEN
        RAISE NOTICE 'The tables have already been renamed.';
        RETURN;
      END IF;

      RAISE EXCEPTION
        'Neither resenha_rooms nor voice_rooms exists. Nothing was changed.';
    END IF;

    IF EXISTS (SELECT 1
               FROM schema_migrations
               WHERE version = '20260831162602') THEN
      RAISE EXCEPTION
        'The rename migration is already recorded. Nothing was changed.';
    END IF;

    FOR table_pair IN
      SELECT *
      FROM (VALUES ('resenha_rooms', 'voice_rooms', '20241107000000'),
                   ('resenha_room_memberships', 'voice_room_memberships',
                    '20241107000000'),
                   ('resenha_sessions', 'voice_sessions', '20260305165400'),
                   ('resenha_co_presences', 'voice_co_presences',
                    '20260305165401'),
                   ('resenha_recordings', 'voice_recordings', '20260717172530'),
                   ('resenha_invites', 'voice_invites',
                    '20260813160047')) AS pairs(old_name, new_name, migration_version)
      LOOP
        IF EXISTS (SELECT 1
                   FROM schema_migrations
                   WHERE version = table_pair.migration_version) AND
           to_regclass(format('public.%I', table_pair.old_name)) IS NULL THEN
          RAISE EXCEPTION
            'Migration % is recorded, but table % is missing. Nothing was changed.',
            table_pair.migration_version,
            table_pair.old_name;
        END IF;

        IF to_regclass(format('public.%I', table_pair.old_name)) IS NOT NULL THEN
          EXECUTE format(
            'ALTER TABLE public.%I RENAME TO %I',
            table_pair.old_name,
            table_pair.new_name
                  );

          RAISE NOTICE 'Renamed % to %', table_pair.old_name, table_pair.new_name;
        END IF;
      END LOOP;
  END
$$;

これにより、以下のことが行われます:

  1. 存在する Resenha テーブルと Voice テーブルを確認します。
  2. 両方が存在する場合、処理を中断します(これは発生しないはずですが)。
  3. 記録されているマイグレーションが期待通りのものかどうかを確認します。
  4. 既存のテーブルをリネームします:
    • resenha_rooms → voice_rooms
    • resenha_room_memberships → voice_room_memberships
    • resenha_sessions → voice_sessions
    • resenha_co_presences → voice_co_presences
    • resenha_recordings → voice_recordings
    • resenha_invites → voice_invites
  5. これにより、現在直面している奇妙な中間状態の問題が解決します。その後の再構築が成功するはずです。

これにより、コアの残りのマイグレーションが成功するようになるはずです(リネームを行う直近のコアボイスマイグレーションは、何もしないで終了します)。

チームに確認して、これを rake タスクとしてコミットすべきかどうか検討します。

ありがとうございます!完璧に動作しました。