Предотвращение миграции данных в миграции схем для Rails
Могли ли вы повторно запустить все миграции в проекте? Как часто вам приходилось исправлять их, пока производство было под огнем? Что вы можете сделать, чтобы предотвратить проблемы с миграцией и не тратить на неё много времени?
Решение
Не связывайтесь с миграцией схем и данных! Разделите эти проблемы. Для этого существует довольно распространенная стратегия:
- Используйте миграции только для изменения схемы
- Используйте разовые задания для загрузки/трансформации/импорта данных
- Активно уничтожайте старые миграции и убирайте лишние задачи
Как вы можете воспользоваться им?
Как обычно, есть готовые решения с большим количеством помощников, чтобы всё это работало:
Но это можно сделать и без использования гемов, следуя простым правилам.
Алгоритм «сделай сам»
- Добавьте сервис для миграции данных.
- (Необязательно) Если вы используете способ TDD, вам также следует добавить тесты для него. Убедитесь, что производственные данные не будут повреждены после миграции.
- Создайте одноразовую задачу rake с меткой времени. Временная метка упростит поиск несвязанных задач и их очистку.
- В задаче нужно запустить Сервис. Не нужно никакой логики. Просто запустите и выведите данные.
- При выходе: вызовите задачу rake.
- А после успешного выполнения расписание удалит задачу rake и весь избыточный код, который использовался только для этого Сервиса.
Подробнее о проблеме
Разработчики Ruby на Rails не часто повторяют миграции. Но миграции — это самый «скоропортящийся продукт» в проекте.
Схемы моделей, методы и вообще логика в миграциях, как обычно, теряют актуальность через очень короткое время. Мы не используем это на повседневной основе, поэтому быстрее найти проблему не получится.
В результате однажды у вас возникнет ситуация, когда вам нужно будет запустить миграцию. И вы обнаружите, что она сломана. Потребуется некоторое время и силы, чтобы всё исправить и заставить её работать.
Но, как обычно, у вас в это время горит производство, и в последнюю очередь вы хотели бы исправить миграции.
Прочие решения
Одна из идей, как сделать так, чтобы миграции работали как можно дольше, — не использовать прямые ссылки на модели, избегать вызовов методов и заменить запросы к активным записям на необработанные SQL-запросы.
Кроме того, вы можете регулярно проводить чистку и удаление миграций, но, как обычно, мы не особо заботимся о них, как только поставляем их в производство.