mergulhao.info
Por Sylvestre Mergulhão
Sylvestre Mergulhão é programador web e fundador da HE:labs.
Veja também minhas palestras no Speaker Deck e me acompanhe no twitter @smergulhao.
Um pouco de migrações - Rails migrations
Postado em 03/06/2007
Para acompanhar a evolução da sua base de dados, no Rails, existem as migrações. Migrações nada mais são do que scripts escritos em linguagem Ruby e que utilizam API disponibilizada pelo Rails para criação, alteração de tabelas do banco de dados. Tal qual as outras operações do ActiveRecord, as migrações também são códigos independentes do SGBD que está utilizando. Com isso ela permite facilmente a migração da aplicação para outro SGBD. São fortes aliadas no desenvolvimento incremental.
Ao criar um modelo usando o generate, temos:
$ script/generate model client
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/client.rb
create test/unit/client_test.rb
create test/fixtures/clients.yml
create db/migrate
create db/migrate/001_create_clients.rb
Reparem no arquivo db/migrate/001_create_clients.rb que foi criado. Editando ele, temos:
class CreateClients < ActiveRecord::Migration
def self.up
create_table :clients do |t|
end
end
def self.down
drop_table :clients
end
end
Vamos supor que gostaríamos de ter para o nosso client os atributos, name, birth e email. Então alteramos o arquivo para:
class CreateClients < ActiveRecord::Migration
def self.up
create_table :clients do |t|
t.column :name, :string
t.column :birth, :date
t.column :email, :string
end
end
def self.down
drop_table :clients
end
end
Agora para rodar a migração(a base de dados já deve existir e estar configurada no database.yml):
rake db:migrate
Verificando em nosso banco de dados temos a tabela criada com os campos que desejamos e também a tabela schema_info, que serve para o controle da versão em que o banco se encontra.
Se em determinado ponto do projeto fosse necessário adicionar um novo atributo para nosso client, então procederíamos assim:
script/generate migration add_sex_to_client
Agora editando o arquivo db/migrate/002_add_sex_to_client.rb que foi criado, deixamos assim:
class AddSexToClient < ActiveRecord::Migration
def self.up
add_column :clients, :sex, :string
end
def self.down
remove_column :clients, :sex
end
end
E para rodar a migração:
rake db:migrate
É importante manter sempre consiso o método self_down, para que seja possível retornar à base para versões anteriores, mas é claro que existem situações onde não há como reverter a migração. Para atualizar o banco com uma migração específica:
rake db:migrate VERSION=1
Nas migrações também podem ser adicionados dados no banco utilizando os próprios modelos(_models_) da sua aplicação Rails. Mas é preciso ficar atento quando à utilização indiscriminada desse recurso, pois eventualmente se esse modelo deixa de existir ou se os métodos utilizados são modificados, a sua migração pode ficar quebrada e incapaz de subir um banco do zero até a última revisão.
Alguns links com mais informações: