См. http://edgeguides.rubyonrails.org/active_record_migrations.html#schema-dumping-and-you
Миграции не представляют собой базу данных: struct.sql или schema.rb - это.Миграции также не хорошее место для установки / инициализации данных.db/seeds
или грабли лучше подходят для такого рода задач.
Так что же такое миграции?На мой взгляд, они являются инструкциями по изменению схемы базы данных - вперед или назад (с помощью отката).Если проблема не возникает, их следует запускать только в следующих случаях:
- На моем локальном компьютере разработки, чтобы проверить саму миграцию и записать файл схемы / структуры.
- На компьютерах коллег-разработчиков как способ изменения схемы без удаления базы данных.
- На производственных машинах как способ изменения схемы без удаления базы данных.
После запускаони должны не иметь значения.Конечно, случаются ошибки, поэтому вы определенно хотите сохранить миграции в течение нескольких месяцев на случай отката.
CI-средам когда-либо не нужно запускать миграции.Это замедляет вашу CI-среду и подвержено ошибкам (как говорит руководство Rails).Поскольку в ваших тестовых средах есть только эфемерные данные, вы должны вместо этого использовать rake db:setup
, который будет загружаться из schema.rb / structure.sql и полностью игнорировать ваши файлы миграции.
Если вы используете систему контроля версийнет никакой пользы в сохранении старых миграций;они являются частью истории источника.Возможно, имеет смысл поместить их в архивную папку, если это ваша чашка кофе.
Учитывая все вышесказанное, я твердо думаю, что имеет смысл очистить старые миграции по следующим причинам:
- Они могут содержать старый код, который больше не будет работать (например, если вы удалили модель).Это создает ловушку для других разработчиков, которые хотят запускать
rake db:migrate
. - Они будут замедлять задачи, подобные
grep
, и не имеют значения после определенного возраста.
Почемуони не имеют отношения?Еще раз по двум причинам: история хранится в вашем исходном элементе управления, а фактическая структура базы данных хранится в struct.sql / schema.rb.Мое эмпирическое правило заключается в том, что миграции старше 12 месяцев совершенно не имеют значения.Я их удаляю.Если бы была какая-то причина, по которой я хотел откатить миграцию, более раннюю, чем эта, я уверен, что база данных за это время изменилась достаточно, чтобы написать новую миграцию для выполнения этой задачи.
Итак как вы избавляетесь от миграций?Вот следующие шаги, которые я выполняю:
- Удаление файлов миграции
- Напишите задачу rake, чтобы удалить соответствующие строки в таблице schema_migrations вашей базы данных.
- Выполнить
rake db:migrate
для регенерации struct.sql / schema.rb. - Убедитесь, что единственное, что изменилось в structure.sql / schema.rb - это удаленные строки, соответствующие каждой удаленной миграции.
- Разверните, а затем запустите задачу rake из шага 2. На рабочем компьютере
- Убедитесь, что другие разработчики запускают задачу rake из шага 2. на своих машинах.
Второй элемент необходим длядержите схему / структуру точной, что, опять же, единственное, что на самом деле имеет значение здесь