Migração em 3 etapas para mover colunas com dados para uma nova tabela

No trabalho hoje tive o prazer de trabalhar em um aplicativo de nível de produção que precisava mover algumas colunas que já estavam preenchidas com dados de uma tabela existente (Coupon) para uma nova tabela (CouponRules) no postgres. A maneira mais segura de fazer isso é o processo de migração em 3 etapas. Ele deve funcionar com a maioria dos bancos de dados mysql.

Primeiro você precisa criar a nova tabela e seus arquivos de migração

rails g model CouponRules kind:string discount:decimal coupon_id:integer

e execute rake db: migrate

Em segundo lugar, você precisa criar um novo arquivo de migração

rails g migration MoveColumnDataToCouponRulesTable

e adicione este:

def change
Coupon.find_each do |coupon|
coupon
.coupon_rules.create(
:kind => coupon.kind,
:discount => coupon.discount,
:coupon_id => coupon.id
)
end
end

Esta é a maneira mais fácil de fazer as coisas e não é recomendada se você tiver um grande conjunto de dados para o qual precisa migrar porque é lento. Para grandes conjuntos de dados, você deve usar SELECT, mas vamos mantê-lo simples por enquanto.

Basicamente, o que isso faz é localizar cada registro de cupom e “copiar” o tipo, o desconto e o id_do_cupon para a nova tabela CouponRules.

em seguida, execute rake db: migrate

Lembre-se de que você só pode executar o arquivo de migração uma vez. se você atualizar o banco de dados e executar a migração novamente, ele não será atualizado. Você deve ir ao console do Rails e verificar se os dados existem em sua nova tabela. Se você encontrar erros, pode executar db: rollback.

A última etapa é remover as colunas da Tabela de cupons.

rails g migration RemoveColumnsfromCouponTable

def change
remove_column
:coupons, :kind
remove_column
:coupons, :discount
end

e execute rake db: migrate

Pronto!

Se você tiver dúvidas ou quiser desenvolver o SELECT, fique à vontade para adicionar sua opinião na seção de comentários.

Espero que ajude!