Миграция Rebase Rails в долгосрочном проекте
В том, что я подразумеваю "rebasing" в словаре, а не git definition...
У меня есть большой, долговременный проект Rails, который имеет около 250 миграций, и он становится очень громоздким, чтобы управлять всем этим.
Тем не менее, мне нужна база, из которой можно очистить и перестроить мою базу данных при выполнении тестов. Поэтому данные, содержащиеся в них, важны.
Есть ли у кого-нибудь какие-либо стратегии, например, сброс схемы в заданное значение - архивирование всех старых миграций и запуск заново с помощью новых миграций.
Очевидно, я могу использовать схему rake: дамп - но мне действительно нужен способ, которым db: migrate сначала загружает схему, а затем запускает остальные миграции.
Я хотел бы продолжать использовать миграции, поскольку они очень полезны в разработке, однако я не собираюсь возвращаться и редактирую переход с 2007 года, поэтому кажется глупым его сохранить.
Ответы
Ответ 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 секунд. Если вы ожидаете обновления этих данных для выполнения дальнейшей работы (особенно много раз), это имеет огромное значение в рабочем процессе.