Как DB: мигрировать после восстановления базы данных из mysql дамп в docker - PullRequest
2 голосов
/ 17 апреля 2020

У меня есть два контейнера docker для mysql и ruby, а контейнер ruby зависит от контейнера mysql.

В моем docker-compose я смонтировал объем sql дамп в /docker-entrypoint-initdb.d контейнера mysql, чтобы он выполнялся при первом запуске контейнера, а база данных заполняется некоторыми данными.

Дамп sql выполняется и данные возвращаются в контейнер БД, как и ожидалось, но проблема в том, что при запуске контейнера ruby (с рельсами) он выбрасывает migration pending error. Я понимаю, что это происходит потому, что в таблице schema_migrations не записано ни одной версии миграции схемы, поскольку данные были намеренно восстановлены из дампа sql.

Но даже запуск docker-compose run <container> rake db:migrate не будет справка, потому что она выдает ошибку table already exists, поскольку таблицы уже созданы.

Как синхронизировать c версий миграции схемы rails с фактическими данными в базе данных?

Я также попытался вручную добавить номер последней версии схемы в таблицу schema_migrations, но все равно возвращает migration pending error. И я не могу запустить docker-compose run <container> rake db:create db:migrate до восстановления из sql dump, потому что файлы внутри /docker-entrypoint-initdb.d контейнера будут выполняться, только если база данных еще не создана.

1 Ответ

1 голос
/ 17 апреля 2020

Я думаю, что вы можете сбросить все данные внутри schema_migrations вместе с вашей исходной схемой дампа, чтобы она содержала версии миграции и не вызывала исключение при запуске rails db:migrate.

Update : Более старая версия rails фактически проверяет все версии схемы, чтобы решить, требуется ли миграция. Вы можете проверить здесь для получения дополнительной информации.

      def needs_migration?(connection = Base.connection)
        (migrations(migrations_paths).collect(&:version) - get_all_versions(connection)).size > 0
      end

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...