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