Migrando dados entre sistemas de bancos de dados com ActiveRecord

on September 22, 2014 12:13

Recentemente migrei este blog de MySQL para PostgreSQL.

Um dos problemas que tinha que resolver era migrar os posts existentes sem perder dados. Como os formatos de dump podem ser incompatíveis, resolvi usar o próprio ActiveRecord para me ajudar a migrar os dados.

Baixei um dump do MySQL, carreguei num BD local, e criei um banco novo no PostgreSQL.

Como eu refiz todo o código (a versão do Rails estava em 2.3.x :p), já configurei o database.yml para usar o adapter do PostgreSQL:

# config/database.yml
development:
  adapter: postgresql
  encoding: unicode
  database: blog_development
  pool: 5
  username: root
  password:
  socket: /var/pgsql_socket/.s.PGSQL.5432

Então o que eu tive que fazer foi configurar uma nova conexão para o banco legado em MySQL:

# config/database.yml
legacy_development:
  adapter: mysql2
  database: blog_development
  username: root
  password:
  port: 3306
  host: localhost

A partir daí criei um model temporário, usando a conexão MySQL:

# app/models/legacy_post.rb
class LegacyPost < ActiveRecord::Base
  establish_connection :legacy_development
  self.table_name = "posts"
end

Daí foi só entrar no console e rodar o script:

# console
LegacyPost.all.each do |legacy_post|
  Post.create(legacy_post.attributes)
end

A partir daí você pode apagar o model e editar a configuração do banco legado.

comments powered by Disqus