Panduan Menyelesaikan Konflik Migrasi Prisma
Jangan jalankan prisma migrate reset pada database produksi.
Jika Anda melihat pesan yang menyatakan bahwa migrasi telah dimodifikasi atau Anda perlu mengatur ulang (reset) skema, berhentilah. Melakukan reset akan menghapus semua data Anda. Anda dapat memperbaiki konflik ini secara manual tanpa kehilangan apa pun.
Kesalahan Prisma yang Umum Terjadi dan Cara Mengatasinya
Error: Migrasi gagal di tengah jalan (P3018)
• Perbaiki file SQL.
• Jalankan: npx prisma migrate resolve --rolled-back [migration_name]
• Jalankan: npx prisma db execute --file [path_to_sql_file]
• Jalankan: npx prisma migrate resolve --applied [migration_name]
Error: Migrasi dimodifikasi setelah diterapkan (Ketidakcocokan Checksum)
• Hitung hash SHA-256 dari file migrasi Anda saat ini.
• Perbarui checksum di tabel _prisma_migrations.
• Penting: Perbarui semua baris untuk nama migrasi tersebut. Jangan memfilter berdasarkan rolled_back_at.
Error: Kolom shadow database hilang (P3006) • Ini terjadi ketika sebuah migrasi merujuk ke kolom yang dibuat oleh migrasi berikutnya. • Prisma menjalankan ulang migrasi berdasarkan urutan timestamp. • Solusi: Pindahkan kode SQL ke migrasi tempat kolom tersebut pertama kali dibuat.
Error: DROP COLUMN diblokir oleh kebijakan RLS
• PostgreSQL Row Level Security mengaitkan kebijakan ke kolom.
• Solusi: Gunakan CASCADE saat menghapus kolom.
• Contoh: ALTER TABLE "my_table" DROP COLUMN IF EXISTS "tenant_id" CASCADE;
Praktik Terbaik untuk Migrasi yang Aman
- Lakukan query ke database terlebih dahulu. Jangan menebak apakah sebuah kolom atau indeks ada. Gunakan query SQL langsung untuk memeriksa skema database Anda yang sebenarnya sebelum menulis kode migrasi.
- Gunakan
IF EXISTSdanIF NOT EXISTS. Ini membuat migrasi Anda bersifat idempoten. Migrasi yang idempoten dapat dijalankan berkali-kali tanpa menyebabkan kesalahan. - Gunakan blok
DOuntuk constraint. Bungkus penambahan Foreign Key dalam pengecekan untuk melihat apakah nama constraint sudah ada. - Selalu gunakan
CASCADEuntuk penghapusan jika Anda menggunakan Row Level Security.
Tabel Ringkasan
• P3018 (Gagal di tengah jalan): Perbaiki SQL, lalu gunakan resolve --rolled-back dan resolve --applied.
• Ketidakcocokan checksum: Hitung hash baru dan perbarui semua baris di _prisma_migrations.
• Error Shadow DB: Periksa urutan timestamp Anda dan pindahkan logika SQL.
• Error RLS: Tambahkan CASCADE pada pernyataan DROP Anda.
