sql >> Base de Datos >  >> RDS >> Mysql

RoR:¿cómo pruebo mi aplicación en varias bases de datos?

@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.