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


171

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

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


Внимание:

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


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Замечательно, когда вы впервые запускаете систему в производство. После этого вы должны запустить миграцию в обычном режиме.

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


Таким образом, вы можете «очистить» свои миграции, потому что вам никогда не придется их использовать? Похоже на странное утверждение.
— Абе Петрильо

Мне неясно, какая польза от 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 загружает только схему.


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 ...


0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.