Przewodnik po rozwiązywaniu konfliktów migracji Prisma
Nie uruchamiaj prisma migrate reset na bazie danych produkcyjnej.
Jeśli zobaczysz komunikat informujący, że migracja została zmodyfikowana lub że musisz zresetować schemat, zatrzymaj się. Reset spowoduje usunięcie wszystkich danych. Możesz naprawić te konflikty ręcznie, nie tracąc niczego.
Typowe błędy Prisma i sposoby ich naprawy
Błąd: Migracja przerwana w trakcie działania (P3018) • Napraw plik SQL. • Uruchom: npx prisma migrate resolve --rolled-back [migration_name] • Uruchom: npx prisma db execute --file [path_to_sql_file] • Uruchom: npx prisma migrate resolve --applied [migration_name]
Błąd: Migracja zmodyfikowana po jej zastosowaniu (Niezgodność sumy kontrolnej)
• Oblicz skrót SHA-256 swojego aktualnego pliku migracji.
• Zaktualizuj sumę kontrolną w tabeli _prisma_migrations.
• Ważne: Zaktualizuj wszystkie wiersze dla danej nazwy migracji. Nie filtruj po rolled_back_at.
Błąd: Brak kolumny w Shadow database (P3006) • Dzieje się tak, gdy migracja odwołuje się do kolumny, którą tworzy późniejsza migracja. • Prisma odtwarza migracje zgodnie z kolejnością znaczników czasu (timestamp). • Naprawa: Przenieś kod SQL do migracji, w której kolumna jest po raz pierwszy tworzona.
Błąd: Operacja DROP COLUMN zablokowana przez politykę RLS
• PostgreSQL Row Level Security wiąże polityki z kolumnami.
• Naprawa: Użyj CASCADE podczas usuwania kolumn.
• Przykład: ALTER TABLE "my_table" DROP COLUMN IF EXISTS "tenant_id" CASCADE;
Dobre praktyki dla bezpiecznych migracji
- Najpierw wykonaj zapytanie do bazy danych. Nie zgaduj, czy kolumna lub indeks istnieje. Użyj bezpośrednich zapytań SQL, aby sprawdzić rzeczywisty schemat bazy danych przed napisaniem kodu migracji.
- Używaj
IF EXISTSiIF NOT EXISTS. Dzięki temu Twoje migracje będą idempotentne. Idempotentna migracja może być uruchamiana wielokrotnie bez powodowania błędów. - Używaj bloków
DOdla ograniczeń (constraints). Obuduj dodawanie kluczy obcych (Foreign Key) sprawdzeniem, czy nazwa ograniczenia już istnieje. - Zawsze używaj
CASCADEprzy usuwaniu, jeśli korzystasz z Row Level Security.
Tabela podsumowująca
• P3018 (Przerwana w trakcie): Napraw SQL, a następnie użyj resolve --rolled-back i resolve --applied.
• Niezgodność sumy kontrolnej: Oblicz nowy skrót i zaktualizuj wszystkie wiersze w _prisma_migrations.
• Błąd Shadow DB: Sprawdź kolejność znaczników czasu i przenieś logikę SQL.
• Błąd RLS: Dodaj CASCADE do instrukcji DROP.
