Phoenix запрашивает запуск несуществующей миграции

#elixir #phoenix-framework #ecto

#elixir #phoenix-framework #ecto

Вопрос:

Давайте опишем проблему:

  • Я создал новое приложение phoenix с mix phx.new
  • Я настроил подключение к базе данных внутри {dev, test}.exs (я сопоставляю существующую базу данных)
  • Я создал контекст, используя mix phx.gen.context (который создал миграцию)

Я попытался запустить сервер в первый раз, но он сказал мне, что у меня не развернутые миграции.

 there are pending migrations for repo: Some.Repo. 
Try running `mix ecto.migrate` in the command line to migrate it
  

Затем я понял, что они мне не нужны, поскольку у меня уже есть база данных, поэтому я удалил файл миграции ( /priv/repo/migrations/* ) и попробовал снова.

Теперь mix ecto.migrations ничего не отображается, но приглашение сервера не было удалено. Затем я обнаружил, что ecto создает дополнительную таблицу в базе данных для миграции, поэтому я проверил ее, и она была пустой.

Я удалил его и попытался запустить сервер снова, но было показано то же сообщение.


Чтобы убедиться, что это не проблема с Ecto, я подготовил тесты, и они работают нормально, единственная проблема — это приглашение миграции, отображаемое при запуске сервера.


У меня пока нет конечных точек, поскольку я планировал использовать GraphQL после того, как я убедился, что модели работают, но это сообщение сбивает с толку.

Есть ли какие-либо скрытые файлы для этой миграции или я что-то еще упускаю?

Отслеживание стека:

 [error] #PID<0.451.0> running Some.Endpoint (connection #PID<0.449.0>, stream id 1) terminated
Server: localhost:4000 (http)
Request: GET /
** (exit) an exception was raised:
    ** (Phoenix.Ecto.PendingMigrationError) there are pending migrations for repo: Some.Repo. Try running `mix ecto.migrate` in the command line to migrate it
        (phoenix_ecto 4.2.1) lib/phoenix_ecto/check_repo_status.ex:67: Phoenix.Ecto.CheckRepoStatus.check_pending_migrations!/2
        (phoenix_ecto 4.2.1) lib/phoenix_ecto/check_repo_status.ex:27: anonymous fn/3 in Phoenix.Ecto.CheckRepoStatus.call/2
        ...
[error] #PID<0.454.0> running Some.Endpoint (connection #PID<0.449.0>, stream id 2) terminated
Server: localhost:4000 (http)
Request: GET /favicon.ico
** (exit) an exception was raised:
    ** (Phoenix.Ecto.PendingMigrationError) there are pending migrations for repo: Some.Repo. Try running `mix ecto.migrate` in the command line to migrate it
        (phoenix_ecto 4.2.1) lib/phoenix_ecto/check_repo_status.ex:67: Phoenix.Ecto.CheckRepoStatus.check_pending_migrations!/2
        (phoenix_ecto 4.2.1) lib/phoenix_ecto/check_repo_status.ex:27: anonymous fn/3 in Phoenix.Ecto.CheckRepoStatus.call/2
        ...
  

Обновить

После дальнейшего изучения кажется, что проект каким-то образом сохраняет первую миграцию, сгенерированную mix phx.new.context .

Всякий раз, когда я заново создаю базу данных, она запрашивает миграцию этого самого контекста. У меня нет файлов, в которых упоминается эта миграция в моем проекте.

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

1. Что Ecto.Migrator.migrations(Some.Repo) возвращает для вас?

2. @KonstantinStrukov [{:down, 20201111101131, "create_person"}]

3. Как я и опасался, эта проблема не позволяет мне протестировать api.

4. Вы пытались найти эту таинственную create_person миграцию? Посмотрите сюда — мне кажется, что путь миграции может быть настроен для каждого репозитория, поэтому, пожалуйста, проверьте, что Some.Repo.config()[:priv] вам дает — скорее всего, ваша миграция находится где-то в другом месте…

5. @KonstantinStrukov Мне удалось решить эту проблему, удалив таблицы и запустив запрошенную миграцию. Когда я впоследствии заново создал базу данных, это сработало. Я полагаю, что это было бы серьезной проблемой при других обстоятельствах. Some.Repo.config()[:priv] Возвращает Right now nil .

Ответ №1:

У меня была эта проблема, и она была решена только путем удаления _build папки, больше ничего не работало, ecto.reset ни удаление таблицы миграций. Elixir должен где-то хранить какое-то состояние, связанное с миграциями в проекте.

 rm -rf _build/
  

Ответ №2:

запустите mix ecto.migrations Это покажет вам миграции, которые у вас есть. Этот список (надеюсь) будет соответствовать списку в /priv/repo/migrations . Перейдите в _build/<имя_пользователя>/priv/repo/migrations и удалите отсюда файлы, которых нет в двух других списках миграции. Кажется, это сработало для меня

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

1. Спасибо, это отлично сработало для меня в новом проекте, подключающемся к уже установленной базе данных.