@awendt gentilmente apontou que eu poderia responder minha própria pergunta.
Acontece que a receita é bastante simples. O segredo é usar uma variável de ambiente para dizer ao Rails qual db você quer usar.
1. Modificando seus arquivos
Em
config/database.yml
, inclua construções ERB como esta:test:
<% if (ENV["RAILS_DB"] == "PostgreSQL") %>
adapter: postgresql
encoding: unicode
database: bd_test
pool: 5
username: <%= ENV['POSTGRESQL_USERNAME'] || 'root' %>
password: <%= ENV['POSTGRESQL_PASSWORD'] || '' %>
<% elsif (ENV["RAILS_DB"] == "MySQL") %>
adapter: mysql
encoding: utf8
reconnect: false
database: bd_test
pool: 5
username: <%= ENV['MYSQL_USERNAME'] || 'root' %>
password: <%= ENV['MYSQL_PASSWORD'] || '' %>
socket: <%= ENV['MYSQL_SOCKET'] || '/tmp/mysql.sock' %>
<% else %>
# default to SQLite
adapter: sqlite3
database: db/test.sqlite3
pool: 5
timeout: 5000
<% end %>
Nota 1:mostrei apenas para o ambiente de teste. Na verdade, esse é o único que modifiquei, já que (supostamente) ele fornece cobertura suficiente para me dizer se todos os três bancos de dados são suportados adequadamente.
Nota 2:Você não precisa usar variáveis de ambiente para definir nome de usuário e senha -- isso é apenas algo que prefiro fazer, pois evita expor senhas em um arquivo comumente visualizado.
Da mesma forma, estenda o Gemfile da seguinte forma (observe que os números de sua versão podem variar):
source 'http://rubygems.org'
gem 'rails', '3.0.3'
case ENV["RAILS_DB"]
when "PostgreSQL"
gem 'pg', '0.10.0'
when "MySQL"
gem 'mysql2'
else
gem 'sqlite3', '1.3.3'
gem 'sqlite3-ruby', '1.3.3', :require => 'sqlite3'
end
...
2. Adicione condições ao seu código
Apesar dos melhores esforços da equipe de desenvolvimento do Rails, existem alguns pontos em que as construções do ActiveRecord não são compatíveis em todos os tipos de banco de dados. Nesses casos, você pode condicionar seu código em
ActiveRecord::Base.connection.adapter_name
. Aqui está um exemplo de um dos meus arquivos de migração:file: migrate/20110129023453_create_cached_web_pages.rb
def self.up
create_table :cached_web_pages do |t|
t.string :key
if ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
t.binary :value
else
t.binary :value, :limit => 16777215
end
end
end
...
3. Executando e testando
Agora você pode selecionar um banco de dados simplesmente definindo a variável de ambiente RAILS_DB, mas há um problema:você precisa executar
bundle install
cada vez para configurar o adaptador de banco de dados apropriado do Gemfile. Felizmente, é exatamente isso que o código de teste faz. Assim, por exemplo, posso executar o autoteste do rspec em duas janelas:$ RAILS_DB=SQLite autotest
e
$ RAILS_DB=PostgreSQL autotest
Agora eu posso hackear meus arquivos e o autoteste me alertará silenciosamente se eu quebrar alguma coisa enquanto eu prossigo.