@awendt señaló amablemente que podía responder mi propia pregunta.
Resulta que la receta es bastante simple. El secreto es usar una variable de entorno para decirle a Rails qué base de datos quieres usar.
1. Modificando sus archivos
En config/database.yml
, incluya construcciones 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:solo lo he mostrado para el entorno de prueba. De hecho, ese es el único que he modificado, ya que (supuestamente) proporciona suficiente cobertura para decirme si las tres bases de datos son compatibles correctamente.
Nota 2:no necesita usar variables de entorno para configurar el nombre de usuario y la contraseña; eso es algo que prefiero hacer, ya que evita exponer las contraseñas en un archivo que se ve comúnmente.
Del mismo modo, extienda Gemfile de la siguiente manera (tenga en cuenta que sus números de versión pueden 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. Añade condiciones a tu código
A pesar de los mejores esfuerzos del equipo de desarrollo de Rails, hay algunos lugares en los que las construcciones de ActiveRecord no son compatibles en todas las versiones de la base de datos. En estos casos, puede condicionar su código en ActiveRecord::Base.connection.adapter_name
. Aquí hay un ejemplo de uno de mis archivos de migración:
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. Ejecutando y probando
Ahora puede seleccionar una base de datos simplemente configurando la variable de entorno RAILS_DB, pero hay un problema:debe ejecutar bundle install
cada vez para configurar el adaptador de base de datos adecuado desde Gemfile. Afortunadamente, eso es exactamente lo que hace el código de prueba. Entonces, por ejemplo, puedo ejecutar la prueba automática de rspec en dos ventanas:
$ RAILS_DB=SQLite autotest
y
$ RAILS_DB=PostgreSQL autotest
Ahora puedo piratear mis archivos y la prueba automática me avisará silenciosamente si he roto algo a medida que avanzo.