Подтвердить что ты не робот

Миграция Rebase Rails в долгосрочном проекте

В том, что я подразумеваю "rebasing" в словаре, а не git definition...

У меня есть большой, долговременный проект Rails, который имеет около 250 миграций, и он становится очень громоздким, чтобы управлять всем этим.

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

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

Очевидно, я могу использовать схему rake: дамп - но мне действительно нужен способ, которым db: migrate сначала загружает схему, а затем запускает остальные миграции.

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

4b9b3361

Ответ 1

В общем, вам не нужно очищать старые миграции. Если вы используете db: migrate from scratch (нет существующего db), Rails использует db/schema.rb для создания таблиц вместо запуска каждой миграции. В противном случае он запускает миграцию, необходимую для обновления с текущей схемы до последней.

Если вы все же хотите объединить миграции до заданной точки в одну, вы можете попробовать:

  • перейти с нуля до целевой схемы с помощью rake db:migrate VERSION=xxx
  • сбрасывать схему с помощью rake db:schema:dump
  • удалите миграции с начала до версии xxx и создайте один новый перенос, используя содержимое db/schema.rb(поместите команды create_table и add_index в метод self.up новой миграции).

Обязательно выберите один из старых номеров версий миграции для вашей агрегированной новой миграции; в противном случае Rails попытается применить эту миграцию на вашем производственном сервере (который уничтожит ваши существующие данные, поскольку в операторах create_table используются: force⇒true).

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

Ответ 2

Чтобы автоматизировать слияние (или раздачу) миграций, вы можете использовать драгоценный камень Squasher

Просто установите

gem install squasher

И запустите с датой, и миграции до этой даты будут объединены:

squasher 2016 # => Will merge all migration created before 2016

Подробнее в README

Ответ 3

В дополнение к предоставленному ответу (который показывает, как консолидировать ваш объем миграции) вы указываете на необходимость очистки данных (которые, как я полагаю, добавляются вручную после заполнения записями ваших таблиц); который указывает, что вы зависите от обновления состояния исходных данных. Некоторые проекты действительно требуют интенсивного уточнения базовых данных, реконструкции и перераспределения таблиц. Наши сильно зависят от повторного выполнения этих операций, и я обнаружил, что если вы можете полностью скомпилировать свою схему в операторах SQL-выполнения, ваши таблицы будут перестраиваться намного быстрее, чем они будут из синтаксиса Ruby.

Тривиальная дополнительная помощь в восстановлении ваших таблиц состоит в том, чтобы выделить отдельное окно терминала в единый объединенный командный оператор:

rake db: drop db: create db: schema: load db: fixtures: load

Каждый раз, когда вам нужно перестроить и повторно заполнить свои таблицы, стрелка вверх и обратное нажатие будет выполнять эту рутинную работу. Если в SQL-запросах нет конфликтов, и если у вас нет дополнительных миграций для запуска, пока вы находитесь в состоянии разработки, операторы SQL будут выполняться, возможно, лучше, чем в два раза быстрее, чем синтаксис Ruby. Например, наши таблицы перестраивают и повторно заполняют через 20 секунд, в то время как синтаксис Ruby увеличивает процесс дольше 50 секунд. Если вы ожидаете обновления этих данных для выполнения дальнейшей работы (особенно много раз), это имеет огромное значение в рабочем процессе.