Как переименовать к...
 
Уведомления
Очистить всё

Как переименовать колонку на проде, чтобы ничего не упало

4 Сообщения
4 Пользователи
3 Реакции
674 Просмотры
stas_1982
Сообщения: 5
Автор темы
Дружит с bundler junior-разработчик
Присоединился: 2 года назад
[#64]

Нужно переименовать orders.sum в orders.total, старое имя всех путает. Локально rename_column, и готово, но тимлид сказал, что на проде так нельзя. Почему, если миграция занимает секунду? Rails 8.0, PostgreSQL.


3 ответа
Егор64
Сообщения: 30
Читает чужие PR тимлид
Присоединился: 3 года назад

Потому что во время деплоя какое-то время работают и старые процессы, и новые. Старые после миграции полезут в sum, а её уже нет, и все запросы к orders, где она упоминается, начнут падать. Плюс Active Record кэширует список колонок при старте, так что даже там, где вы sum явно не трогаете, вставка у старого процесса сломается. Безопасно это делается в несколько релизов. Сначала добавляете total и пишете в обе колонки, потом переносите данные пачками и переводите чтение на total. Затем просите модель не видеть старую колонку:

class Order < ApplicationRecord
  self.ignored_columns += ["sum"]
end

И только следующим релизом удаляете sum. Долго, но откатиться можно в любой момент.


Ответ
kostya.sokurov
Сообщения: 73
Держит прод бэкенд-разработчик, senior
Присоединился: 4 года назад

strong_migrations на rename_column ругается и предлагает ровно этот план. Отдельно про перенос: не одним UPDATE на всю таблицу, а через in_batches(of: 10_000) с паузой между пачками, иначе раздуете WAL и реплика отстанет.


Ответ
slava52
Сообщения: 9
Разобрался с блоками middle-разработчик
Присоединился: 2 года назад

И фабрики с фикстурами проверьте. У меня после такого переименования падала куча тестов, где старое имя было прописано руками


Ответ