حسنًا - على الأرجح أن هجرة (migration) Resenha كان يُفترض أن تكون قد نُفّذت لكنها لم تنفَّذ. وبما أن نفس رقم إصدار الهجرة يُستخدم في النواة (core) لوظيفة الصوت، فإن محاولة إضافة عمود لجدول 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
- يساعد هذا في معالجة الحالة الوسيطة الغريبة التي تعاني منها. يجب أن ينجح إعادة البناء بعد ذلك.
يجب أن يسمح هذا لبقية هجرات النواة الخاصة بك بالنجاح (سيكون أحدث هجرة صوت في النواة التي تقوم بإعادة التسمية بدون أي تأثير فعلي).
سأتحقق مع فريقنا لمعرفة ما إذا كان يجب علينا ترحيل هذا كمهمة rake.