Mysql
 sql >> Database >  >> RDS >> Mysql

RoR:come faccio a testare la mia app su più database?

@awendt ha gentilmente sottolineato che potrei rispondere alla mia stessa domanda.

Si scopre che la ricetta è piuttosto semplice. Il segreto è usare una variabile d'ambiente per dire a Rails quale db vuoi usare.

1. Modificare i tuoi file

In config/database.yml , includi costrutti ERB come questo:

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:l'ho mostrato solo per l'ambiente di test. In effetti, è l'unico che ho modificato, poiché (presumibilmente) fornisce una copertura sufficiente per dirmi se tutti e tre i database sono supportati correttamente.

Nota 2:non è necessario utilizzare le variabili di ambiente per impostare nome utente e password:è solo qualcosa che preferisco fare poiché evita di esporre le password in un file comunemente visualizzato.

Allo stesso modo, estendi Gemfile come segue (nota che i tuoi numeri di versione possono variare):

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. Aggiungi condizioni al tuo codice

Nonostante i migliori sforzi del team di sviluppo di Rails, ci sono alcuni punti in cui i costrutti ActiveRecord non sono compatibili in tutte le versioni di database. In questi casi, puoi condizionare il tuo codice su ActiveRecord::Base.connection.adapter_name . Ecco un esempio da uno dei miei file di migrazione:

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. Esecuzione e test

Ora puoi selezionare un database semplicemente impostando la variabile d'ambiente RAILS_DB, ma c'è un problema:devi eseguire bundle install ogni volta per configurare l'adattatore database appropriato dal Gemfile. Fortunatamente, questo è esattamente ciò che fa il codice di test. Quindi, ad esempio, posso eseguire l'autotest di rspec in due finestre:

$ RAILS_DB=SQLite autotest

e

$ RAILS_DB=PostgreSQL autotest

Ora posso hackerare i miei file e il test automatico mi avviserà silenziosamente se ho rotto qualcosa mentre procedo.