Полезность отката миграций БД - PullRequest
3 голосов
/ 27 сентября 2010

Многие люди говорят о переносе БД, особенно о возможности его отката.

Сомневаюсь, полезно ли это вообще, потому что схема БД и модель тесно связаны с логикой приложения (MVC).

Предположим, я сделал откат некоторой миграции. И что ? Приложение не будет работать, потому что его логика полностью зависит от БД.

Каковы случаи использования возможности отката при переносе БД?


Обновление 1

Основной вопрос

Почему откат представлен как функция, когда мне нужно изменить код?

Я не создаю миграции, например, "add_another_field_to_table". Вместо этого каждый файл миграции полностью описывает каждую таблицу в БД. Когда мне нужно что-то изменить в моей БД, я просто изменяю файл миграции, но не откатывайте это .

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

Ответы [ 6 ]

8 голосов
/ 27 сентября 2010

Смысл отката в том, что вы откатываете код и БД одновременно.Сценарий состоит в том, что вы обновляете свой код и свою БД на своем производственном сервере, затем вы обнаруживаете ошибку и вам действительно нужно вернуться.Поэтому откат вашего кода и использование миграции вниз для отката вашей БД.

4 голосов
/ 27 сентября 2010

В чем смысл миграции Up?

  1. Вы создаете структуры таблиц.
  2. Вы кодируете это, оно работает хорошо.
  3. Вы запускаете сайт в производство, все довольны.
  4. Ой, подождите, им нужна новая функция, которая включает добавление столбца в существующую таблицу.

Как вы справляетесь с этим?Вы должны добавить столбец в свои таблицы разработки, протестировать код, обновить работающий сайт, не забывая одновременно обновлять работающую БД (потому что, если вы это сделаете, будут большие ошибки), а также помнить, чтобы сохранить существующие живые данные.Этот аспект управления БД может быть настоящей болью без хорошего управляемого решения, как у rails.

Итак ...

  1. Кодирование переноса в одну строку с добавлением столбца
  2. Запустите миграцию для dev-копии, scehma.rb обновит
  3. Используйте новые функции кода, если вам нужно проверить схему БД, используйте schema.rb, а НЕ файлы миграции.

Теперь вашготов к выпуску на производстве ....

  1. Обновление кода на производстве
  2. Запуск миграций на производстве.Rails автоматически определит, что необходимо применить, и сделает это за вас!

Конечно, если вы добавите один столбец, вам не составит труда сделать это самостоятельно.

Но что, если бы 3 программиста добавили все миграции?Что если у вас много живых сайтов, все в разных версиях?Это живой сайт 2 или 17 миграций позади?Что мне нужно сделать, чтобы получить БД с последним кодом, сохраняя при этом живые данные?Можете ли вы увидеть, как это очень быстро может запутать в работе?

Миграции Rails (и практически каждая система миграции работает по тем же принципам) предназначены для того, чтобы сделать обновление структур БД действительно простым.Хорошо стоит использовать правильно.

2 голосов
/ 27 сентября 2010

Я обнаружил, что откаты полезны, только если они выполняются локально, то есть когда вы работаете над новым фрагментом кода. После того, как миграция была зафиксирована в вашей системе управления версиями, если вы понимаете, что произошла ошибка, откат миграции на самом деле не работает, потому что другие разработчики отключили миграцию и запустили ее, поэтому вам нужно скажите им, чтобы они тоже откатились - это слишком сложно для управления, а также заставляет вас выглядеть некомпетентным:)

Лучше в этой ситуации просто выполнить другую миграцию для решения проблемы, тогда все (включая ваш производственный сервер) просто придерживаются системы pull & migrate.

1 голос
/ 27 сентября 2010

Не совсем понимаю вашу проблему, но я пытаюсь немного объяснить откат. Вы выполняете откат, если хотите отменить изменения соответствующей миграцией. Это означает, что база данных будет изменена, а также ваш schema.rb будет автоматически восстановлен. Когда вы делаете это, вероятно, вы хотите удалить ссылочный код тоже. Например, если вы удалили поле из модели, возможно, вы не хотите ссылаться на этот атрибут в своем коде. Если вы попытаетесь получить доступ, вы получите неопределенный атрибут исключение. Вот и все. Откат может стать немного громоздким, например, если вы ранее создали некоторые миграции модели 10 и хотите изменить некоторые поля. Лучше создать новую миграцию и изменить ее там, а не откатываться на соответствующую миграцию.

Обновление 1

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

  1. Откат к соответствующей миграции. (rake db:migrate VERSION=XXX, мне нравится больше rake db:rollback STEP = 2 например, откат 2 миграции, STEP необязательно)
  2. Внесите изменения
  3. Перенесите базу данных, чтобы обновить все таблицы, и перейдите к текущей версии миграции. (rake db:migrate)

Эта функция не влияет на ваши модели или что-то в этом роде, просто изменяет файл миграции, восстанавливает ваш schema.rb и меняет структуру базы данных, ничего больше. Не может выполнить откат кода, как с системой контроля версий, и на самом деле не имеет смысла делать что-то подобное. Вы должны позаботиться о том, чтобы не использовать удаленные поля. Rails имеет автоматическое отображение между полями базы данных и атрибутами модели, например, если в вашей таблице comment есть user_id, вы можете назвать его как атрибут вашей модели, comment_instance.user_id. Надеюсь, что это имеет смысл.

0 голосов
/ 27 сентября 2010

Я использую откат миграции локально с rake db:migrate:redo при работе с кодом миграции и перед окончательной фиксацией.

0 голосов
/ 27 сентября 2010

Рассмотрим сценарий, в котором вы используете capistrano для развертывания своего сайта и создания моментальных снимков с метками времени каждого развертывания.Используя метку времени для папки и ваших миграций, вы можете определить, какие версии кода и схемы идут рука об руку и выполнить откат.

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

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