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