#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 nownil
.
Ответ №1:
У меня была эта проблема, и она была решена только путем удаления _build
папки, больше ничего не работало, ecto.reset
ни удаление таблицы миграций. Elixir должен где-то хранить какое-то состояние, связанное с миграциями в проекте.
rm -rf _build/
Ответ №2:
запустите mix ecto.migrations Это покажет вам миграции, которые у вас есть. Этот список (надеюсь) будет соответствовать списку в /priv/repo/migrations . Перейдите в _build/<имя_пользователя>/priv/repo/migrations и удалите отсюда файлы, которых нет в двух других списках миграции. Кажется, это сработало для меня
Комментарии:
1. Спасибо, это отлично сработало для меня в новом проекте, подключающемся к уже установленной базе данных.