Panduan Menyelesaikan Konflik Migrasi Prisma

Jangan jalankan prisma migrate reset pada pangkalan data produksi.

Jika anda melihat mesej yang menyatakan migrasi telah diubah suai atau anda perlu menetapkan semula skema, berhenti. Menetapkan semula akan memadamkan semua data anda. Anda boleh menyelesaikan konflik ini secara manual tanpa kehilangan apa-apa.

Ralat Prisma Biasa dan Cara Menyelesaikannya

Ralat: Migrasi gagal di tengah jalan (P3018) • Baiki fail 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]

Ralat: Migrasi diubah suai selepas ia dilaksanakan (Ketidakpadanan Checksum) • Kira hash SHA-256 fail migrasi semasa anda. • Kemas kini checksum dalam jadual _prisma_migrations. • Penting: Kemas kini semua baris untuk nama migrasi tersebut. Jangan tapis mengikut rolled_back_at.

Ralat: Lajur shadow database hilang (P3006) • Ini berlaku apabila migrasi merujuk kepada lajur yang dicipta oleh migrasi yang kemudiannya. • Prisma memainkan semula migrasi mengikut urutan cap masa (timestamp). • Penyelesaian: Pindahkan kod SQL ke migrasi di mana lajur tersebut dicipta buat kali pertama.

Ralat: DROP COLUMN disekat oleh polisi RLS • Row Level Security PostgreSQL mengaitkan polisi dengan lajur. • Penyelesaian: Gunakan CASCADE semasa memadam lajur. • Contoh: ALTER TABLE "my_table" DROP COLUMN IF EXISTS "tenant_id" CASCADE;

Amalan Terbaik untuk Migrasi yang Selamat

  • Jalankan query pada pangkalan data terlebih dahulu. Jangan teka sama ada lajur atau indeks wujud. Gunakan query SQL secara terus untuk menyemak skema pangkalan data sebenar anda sebelum menulis kod migrasi.
  • Gunakan IF EXISTS dan IF NOT EXISTS. Ini menjadikan migrasi anda bersifat idempotent. Migrasi yang idempotent boleh dijalankan berulang kali tanpa menyebabkan ralat.
  • Gunakan blok DO untuk kekangan (constraints). Bungkus penambahan Foreign Key dalam semakan untuk melihat sama ada nama kekangan tersebut sudah wujud.
  • Sentiasa gunakan CASCADE untuk operasi DROP jika anda menggunakan Row Level Security.

Jadual Ringkasan

• P3018 (Gagal di tengah jalan): Baiki SQL, kemudian gunakan resolve --rolled-back dan resolve --applied. • Ketidakpadanan checksum: Kira hash baharu dan kemas kini semua baris dalam _prisma_migrations. • Ralat Shadow DB: Semak urutan cap masa anda dan pindahkan logik SQL. • Ralat RLS: Tambah CASCADE pada pernyataan DROP anda.

Sumber: https://dev.to/aswindanu_anwar_38c31d278/the-only-guide-you-need-for-prisma-migration-conflicts-without-losing-data-6bc