Руководство по разрешению конфликтов миграций 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]

Ошибка: Миграция была изменена после применения (Checksum mismatch) • Вычислите 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 при удалении, если вы используете Row Level Security.

Сводная таблица

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

Источник: https://dev.to/aswindanu_anwar_38c31d278/the-only-guide-you-need-for-prisma-migration-conflicts-without-losing-data-6bc