Посібник із вирішення конфліктів міграцій Prisma

Не запускайте prisma migrate reset на продуктивній базі даних.

Якщо ви бачите повідомлення про те, що міграцію було змінено або що вам потрібно скинути схему, зупиніться. Скидання видалить усі ваші дані. Ви можете виправити ці конфлікти вручну, нічого не втрачаючи.

Поширені помилки Prisma та способи їх виправлення

Помилка: Міграція перервалася під час виконання (P3018) • Виправте SQL-файл. • Виконайте: npx prisma migrate resolve --rolled-back [migration_name] • Виконайте: npx prisma db execute --file [path_to_sql_file] • Виконайте: npx prisma migrate resolve --applied [migration_name]

Помилка: Міграцію було змінено після її застосування (невідповідність контрольної суми) • Обчисліть хеш SHA-256 вашого поточного файлу міграції. • Оновіть контрольну суму в таблиці _prisma_migrations. • Важливо: оновіть усі рядки для цієї назви міграції. Не фільтруйте за rolled_back_at.

Помилка: Відсутня колонка в тіньовій базі даних (Shadow database) (P3006) • Це трапляється, коли міграція посилається на колонку, яку створює наступна міграція. • Prisma повторно виконує міграції у порядку часових міток (timestamp). • Виправлення: Перенесіть SQL-код у міграцію, де ця колонка створюється вперше.

Помилка: DROP COLUMN заблоковано політикою RLS • Row Level Security у PostgreSQL прив'язує політики до колонок. • Виправлення: Використовуйте CASCADE під час видалення колонок. • Приклад: ALTER TABLE "my_table" DROP COLUMN IF EXISTS "tenant_id" CASCADE;

Найкращі практики для безпечних міграцій

  • Спочатку зробіть запит до бази даних. Не гадайте, чи існує колонка або індекс. Використовуйте прямі SQL-запити, щоб перевірити реальну схему вашої бази даних перед написанням коду міграції.
  • Використовуйте IF EXISTS та IF NOT EXISTS. Це робить ваші міграції ідемпотентними. Ідемпотентна міграція може запускатися кілька разів без виникнення помилок.
  • Використовуйте блоки DO для обмежень (constraints). Оберніть додавання зовнішніх ключів (Foreign Key) у перевірку на те, чи вже існує назва обмеження.
  • Завжди використовуйте CASCADE для видалення (drop), якщо ви використовуєте Row Level Security.

Підсумкова таблиця

• P3018 (Перервано під час виконання): Виправте SQL, потім використайте resolve --rolled-back та resolve --applied. • Невідповідність контрольної суми: Обчисліть новий хеш і оновіть усі рядки в _prisma_migrations. • Помилка Shadow DB: Перевірте порядок часових міток і перенесіть SQL-логіку. • Помилка RLS: Додайте CASCADE до ваших операторів DROP.

Джерело: https://dev.to/aswindanu_anwar_38c31d278/the-only-guide-you-need-for-prisma-migration-conflicts-without-losing-data-6bc