[Prisma 99% 에러 잡기] P3018 : A migration failed to apply. |
🔍 에러 및 발생 원인 분석
1) Error 메시지
2) Error 발생 원인 분석
migration filename | 20240211055424_update_room_id_type_to_string_uuid
/*
Warnings:
- The primary key for the `Room` table will be changed. If it partially fails, the table could be left without primary key constraint.
*/
-- DropForeignKey
ALTER TABLE `Invite` DROP FOREIGN KEY `Invite_roomId_fkey`;
-- DropForeignKey
ALTER TABLE `User` DROP FOREIGN KEY `User_roomId_fkey`;
-- AlterTable
ALTER TABLE `Invite` MODIFY `roomId` VARCHAR(191) NOT NULL;
-- AlterTable
ALTER TABLE `Room` DROP PRIMARY KEY,
MODIFY `id` VARCHAR(191) NOT NULL,
ADD PRIMARY KEY (`id`);
-- AlterTable
ALTER TABLE `User` MODIFY `roomId` VARCHAR(191) NOT NULL;
-- AddForeignKey
ALTER TABLE `User` ADD CONSTRAINT `User_roomId_fkey` FOREIGN KEY (`roomId`) REFERENCES `Room`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `Invite` ADD CONSTRAINT `Invite_roomId_fkey` FOREIGN KEY (`roomId`) REFERENCES `Room`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
Table[Room] 의 PK 가 기존 number 에서 string ( number -> string ) 으로 변경됨에 따라 해당 작업을 위한 마이그레이션 파일 또한 신규로 생성되었습니다. 하지만, 로컬 환경에서 마이그레이션 후 데이터 확인 과정에서 실반영이 안되는점을 확인하였습니다.
← String 타입의 경우 “123” 이 아닌 “ABC” 로 표시 되어야 합니다.
해당 파트를 제거 후 20240203154156_db_schema_init 마이그레이션 파일에 Table[Room] 의 PK 타입 변환 DDL 을 업데이트 하였으며, 로컬에서 작업한 마이그레이션을 적용하는 과정에서 에러가 발생하였습니다.
✅ 해결 방법 정리
Prisma 의 마이그레이션 관리 방식은 shadow database 를 사용하기 때문에 기존에 남아 있는 마이그레이션 파일 내역을 제거하고 다시 로컬 마이그레이션을 진행하는 방식으로 문제를 해결하였습니다.
( DEV/PROD 환경에서 이와 같은 방법은 지양 합니다. )
📍마무리하며
prisma migrate failed 과정에서 shadow database 내역을 수정함으로써 resolve 하는 방법을 통해 에러를 해결한 내용을 정리해 보았습니다. 추가로 도움이 될만한 prisma docs 링크를 남겨놓습니다!
https://www.prisma.io/docs/orm/prisma-migrate/workflows/patching-and-hotfixing#failed-migration
https://www.prisma.io/docs/orm/prisma-migrate/getting-started