rake db: схема: нагрузка и миграция

171

Здесь очень простой вопрос - если миграция может стать медленной и громоздкой, поскольку приложение становится все более сложным, и если rake db:schema:loadвместо этого у нас гораздо более чистый вызов, почему миграции вообще существуют?

Если ответ на вышесказанное состоит в том, что миграции используются для контроля версий (пошаговая запись изменений в базе данных), то, поскольку приложение становится более сложным и rake db:schema:loadиспользуется вместо этого, продолжают ли они поддерживать свою основную функцию?


Внимание:

Из ответов на этот вопрос: rake db:schema:load удалит данные на рабочем сервере, поэтому будьте осторожны при его использовании.

sscirrus
источник
5
+1 Я никогда не понимал цель миграций; почему не просто контроль версий схемы?
альтернатива
5
@alternative - миграция позволяет вам делать другие вещи, например, если вам нужно добавить ненулевой столбец, вы можете аккуратно заполнить этот столбец данными вместо использования какого-либо значения по умолчанию.
Джош М.

Ответы:

208

Миграции обеспечивают изменения шага вперед и назад в базе данных. В производственной среде при развертывании необходимо вносить постепенные изменения в базу данных: миграции обеспечивают эту функцию с отказоустойчивостью отката. Если вы работаете rake db:schema:loadна рабочем сервере, вы в конечном итоге удалите все свои производственные данные. Это опасная привычка.

При этом, я считаю, что это хорошая практика, чтобы иногда «свернуть» миграцию. Это влечет за собой удаление старых миграций, замену их на одну миграцию (очень похожую на ваш schema.rbфайл) и обновление schema_migrationsтаблицы, чтобы отразить это изменение. Будьте очень осторожны при этом! Вы можете легко удалить свои производственные данные, если не будете осторожны.

Как примечание, я твердо верю, что вы никогда не должны помещать создание данных в файлы миграции. seed.rbФайл может быть использован для этого, или пользовательских грабель или развернуть задачи. Помещение этого в файлы миграции смешивает спецификацию схемы базы данных с вашей спецификацией данных и может привести к конфликтам при запуске файлов миграции.

Джесси Рейсс
источник
80
Спасибо, что сообщили, что rake db: schema: load удаляет все производственные данные!
Магне
2
Вместо того, чтобы заменять «свернутые» миграции новыми, имитирующими схему, я написал гем, который просто очищает их и предлагает пользователям использовать их, db:schema:loadесли они пытаются запустить db:migrateновую установку. @ clear_migrations
Ярин
Возможно, это очевидный ответ, но перед первым запуском в производство вы бы порекомендовали просто удалить все миграции и использовать db.schema в качестве первой миграции?
DTC
30

Просто наткнулся на этот пост, это было давно и не увидел ответа, которого я ожидал.

rake db:schema:loadЗамечательно, когда вы впервые запускаете систему в производство. После этого вы должны запустить миграцию в обычном режиме.

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

ereslibre
источник
Таким образом, вы можете «очистить» свои миграции, потому что вам никогда не придется их использовать? Похоже на странное утверждение.
Абе Петрильо
Мне неясно, какая польза от db:schema:loadэтого, кроме как сэкономить несколько секунд один раз на протяжении всего цикла разработки. Вы когда-нибудь работали с приложением, создание которого заняло более 30 секунд? В настоящее время я работаю над приложением, в котором есть ошибки в файлах миграции, и оно никогда не будет мигрировать без исправления ошибок или запуска, db:schema:loadчто заставляет меня думать о схеме: нагрузка предназначена для случаев, когда что-то пошло не так в отношении разработки приложения.
Ниндзяксор
Еще один аргумент в пользу сохранения миграции заключается в том, что основная команда rails направляет пользователей instead of editing schema.rb, please use the migrations feature. Таким образом, если вы работаете db:schema:loadс автоматически сгенерированным файлом, который не имеет миграций для повторной автоматической генерации, вы фактически идете по пути ручного «редактирования» схемы и отмены миграций. Хотелось бы, чтобы в этом содержалась цитата из руководства по rails, но они не обсуждают schema: load, что пугающе усиливает мое разочарование при решении вопроса о подходе к схеме: load. = /
Ниндзяксор
Я зашел на эту страницу именно потому, что согласен с этим. По моему опыту, когда сайт запущен, гораздо безопаснее использовать миграции для его изменения. Несмотря на это, комментарии начала db / schema.rb точно утверждают обратное! (У меня проблема в начале каждого проекта, потому что я забываю поместить db / schema.rb в .gitignore ...)
user1251840
@AbePetrillo ничего себе, я пропустил этот комментарий полностью. Конечно, нет, я имел в виду, что вы можете очистить старые миграции, которые были запущены на всех производственных машинах, если хотите. На протяжении многих лет я всегда держал их рядом, но мое «помогает вам очистить ваши миграции в любое время», заявление не означало, что «мне никогда не придется использовать миграции». Таким образом, при развертывании новой машины запускайте rake db:schema:loadв противоположность rake db:migrate. Тогда вы можете rake db:migrate.
ereslibre
9

Миграции также позволяют добавлять данные в БД. но db: schema: load загружает только схему.

Shaunak
источник
6

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

Джейми Пенни
источник
4

Как пользователю других ORM, мне всегда казалось странным, что в Rails нет функции «синхронизации и обновления». т. е. с помощью файла схемы (который представляет собой всю современную схему), просмотрите существующую структуру БД и добавьте / удалите таблицы, столбцы, индексы по мере необходимости.

Для меня это было бы намного надежнее, даже если, возможно, немного медленнее.

Дэн Джеймс
источник
1
Задача по переносу базы данных с данными из одной сложной схемы в другую не бывает тривиальной. Это не может быть разрешено автоматически, и данные не могут быть последовательно перенесены за один шаг. Миграция Rails является главной, а схема зависимой. Схема автоматически воссоздается при каждой миграции, но не наоборот.
Оклас
В собственных руководствах Rails прямо указано, что schemaэто мастер, а не миграция.
Дренми
0

Я уже разместил в качестве комментария, но чувствую, что лучше поместить комментарии файла db / schema.rb здесь:

# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.

На самом деле мой опыт показывает, что лучше переносить файлы миграции в git, а не в файл schema.rb ...

user1251840
источник
0

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

В отличие от rake db:migrateэтого запускаются миграции, которые еще не выполнялись, rake db:schema:loadзагружает схему, которая уже сгенерирована в db/schema.rbбазу данных.

Вы можете узнать больше о командах базы данных rake здесь .

Неша Зорич
источник