Как db:schema:load влияет на будущие действия db:migrate

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

  • A — Запустите db:migrate и запустите цикл всех миграций, которые он еще не выполнил.
  • B - Запустите db:schema:load и создайте базу данных из файла схемы.

Я знаю, что B — правильный выбор для новых развертываний, как объясняется в комментариях schema.rb:

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

Мне интересно, как это повлияет на миграцию на рабочем сервере в будущем? Например, если я делаю следующее по порядку:

  1. Запустите db:schema:load на новом рабочем сервере.
  2. Измените мою схему в разработке и нажмите на производство.
  3. Запустите db:migrate на рабочем сервере

Что случится? Будет ли он знать, что нужно использовать только более поздние миграции, чем действие db:schema:load, или попытается запустить их все?


person Yarin    schedule 24.09.2013    source источник
comment
А вы не думали о том, чтобы просто запустить эти пару команд, чтобы проверить себя?   -  person Mike Szyndel    schedule 24.09.2013
comment
@MichaelSzyndel - Кто сказал, что я не думал об этом?   -  person Yarin    schedule 25.09.2013
comment
Ваш вопрос говорит об этом. Если бы вы это сделали, вы бы увидели, что это должно работать нормально (пока таблица миграции db заполняется во время schema:load, что я никогда не проверял)   -  person Mike Szyndel    schedule 25.09.2013


Ответы (1)


Хороший вопрос. Ответ заключается в том, что будут выполняться только миграции, созданные после последнего события db:schema:load.

С файлом schema.rb связана отметка версии:

ActiveRecord::Schema.define(version: 20130928225041) do ...

Когда вы запускаете db:schema:load, Rails создает новую базу данных в соответствии с этим файлом schema.rb и в то же время заполняет таблицу schema_migrations всеми миграциями, номер версии которых предшествует номеру версии схемы.

Итак, насколько я могу судить, Rails фактически имитирует все миграции до этого момента, но на самом деле не запускает их. (Я проверил это, сгенерировав пустой файл миграции, вызвав db:migrate локально, но затем вставив ошибку в файл миграции перед его развертыванием на нашем сервере. На сервере мы запустили db:schema:load, и в результате была включена неверная миграция. в таблице schema_migrations, как если бы она была запущена, хотя явно этого не было.)

person Yarin    schedule 28.09.2013