음 - 아마도 실행된 것으로 가정되었지만 실제로는 실행되지 않은 resenha 마이그레이션인 것 같습니다. 코어에서 음성(voice)에 동일한 마이그레이션 버전 번호가 사용되므로, 갑자기 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
$$;
다음과 같은 작업을 수행합니다:
- 존재하는 Resenha 및 Voice 테이블을 확인합니다.
- 두 테이블이 모두 존재하는 경우 계속 진행하는 것을 거부합니다(이러한 상황은 예상하지 않습니다).
- 기록된 마이그레이션이 우리가 기대하는 것과 일치하는지 확인합니다.
- 기존 테이블 이름을 변경합니다:
- 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
- 이는 현재 겪고 있는 이상한 중간 상태를 해결하는 데 도움이 됩니다. 이후 재빌드(rebuild)가 성공해야 합니다.
이것은 나머지 코어 마이그레이션이 성공할 수 있도록 허용합니다(이름 변경을 수행하는 가장 최근의 코어 음성 마이그레이션은 아무것도 하지 않는 no-op이 됩니다).
우리 팀과 이 내용을 rake task로 커밋해야 하는지 확인해 보겠습니다.