Миграция призмы-плохое состояние

#database-migration #prisma

Вопрос:

Похоже, мы привели наши миграции призмы в плохое состояние. Когда мы получим последний код и запустим

 prisma migrate dev
 

мы получаем

Миграция 20210819161149_some_migration не смогла правильно применить к базе данных теней. Код ошибки: P3018 Ошибка: Не удалось применить миграцию. Новые миграции не могут быть применены до устранения ошибки. Подробнее о том, как решить проблемы миграции в производственной базе данных, читайте здесь: https://pris.ly/d/migrate-resolve

Имя миграции: 20210819161149_some_migration

Код ошибки базы данных: 1065

Все миграции в системе управления версиями соответствуют тем, что указаны в _prisma_migrations таблице, поэтому я не уверен, почему она считает 20210819161149_some_migration , что это не удалось. В logs колонке _prisma_migrations для этой записи ничего нет. Я думаю, что произошло то, что разработчик применил миграцию, а затем изменил migration.sql ее постфактум.

В любом случае, мы последовали описанным шагам https://pris.ly/d/migrate-resolve но они, похоже, не решают проблему. Сначала он предлагает запустить

 prisma migrate resolve --rolled-back "20210819161149_some_migration"
 

но это приводит к

Ошибка: P3012

Миграцию 20210819161149_some_migration нельзя откатить, поскольку она не находится в состоянии сбоя.

Поэтому мы попытались отметить это как примененное

 prisma migrate resolve --applied "20210819161149_some_migration"
 

но это приводит к этой ошибке

Ошибка: P3008

Миграция 20210819161149_some_migration уже зарегистрирована как примененная в базе данных.

Мы также пытались бежать

  prisma migrate deploy
 

Что дает

13 миграций, найденных в prisma/миграции ПРЕДУПРЕЖДЕНИЕ Следующие миграции были изменены с момента их применения: 20210819161149_some_migration

но при запуске вы все равно получаете ту же проблему, что и выше prisma migrate dev .

Есть ли какой-нибудь способ снова сделать prisma счастливой, не удаляя все данные?

Ответ №1:

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

Вот как будет выглядеть этот процесс

  1. Удалите всю историю миграции из вашей prisma папки, а также _prisma_migrations таблицу в вашей базе данных.
  2. Создайте новую резервную базу данных.
  3. Подключите проект к базе данных резервной копии и запустите prisma migrate dev --name baseline_migration . Это приведет к созданию миграции, соответствующей вашей текущей схеме prisma.
  4. Вернитесь к своей основной базе данных и запустите созданную миграцию prisma migrate resolve --applied 20210426141759_baseline_migration (номера в начале имени миграции будут отличаться).

Причина, по которой вы создадите резервную базу данных и выполните начальные базовые миграции в этой резервной базе данных, заключается в том, что вы не хотите потерять данные в своей основной базе данных. Я понимаю, что это не идеальное решение, но оно может сработать, если для вас очень важно сохранить свои данные, сохранив существующий рабочий процесс разработки.

Эту статью о добавлении Prisma Migrate в существующий проект также стоит прочитать.

Комментарии:

1. Отличный ответ. Это очень полезно.