@awendt a gentiment fait remarquer que je pouvais répondre à ma propre question.
Il s'avère que la recette est assez simple. Le secret est d'utiliser une variable d'environnement pour indiquer à Rails quelle base de données vous souhaitez utiliser.
1. Modification de vos fichiers
Dans config/database.yml
, incluez des constructions ERB comme ceci :
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 %>
Remarque 1 :je ne l'ai montré que pour l'environnement de test. En fait, c'est la seule que j'ai modifiée, car (soi-disant) elle fournit une couverture suffisante pour me dire si les trois bases de données sont correctement prises en charge.
Remarque 2 :Vous n'avez pas besoin d'utiliser des variables d'environnement pour définir le nom d'utilisateur et le mot de passe. C'est simplement quelque chose que je préfère faire car cela évite d'exposer les mots de passe dans un fichier couramment consulté.
De même, étendez Gemfile comme suit (notez que vos numéros de version peuvent varier) :
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. Ajoutez des conditions à votre code
Malgré les meilleurs efforts de l'équipe de développement Rails, il existe quelques endroits où les constructions ActiveRecord ne sont pas compatibles avec toutes les saveurs de base de données. Dans ces cas, vous pouvez conditionner votre code sur ActiveRecord::Base.connection.adapter_name
. Voici un exemple tiré d'un de mes fichiers de migration :
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. Exécution et test
Vous pouvez maintenant sélectionner une base de données simplement en définissant la variable d'environnement RAILS_DB, mais il y a un hic :vous devez exécuter bundle install
à chaque fois pour configurer l'adaptateur de base de données approprié à partir du Gemfile. Heureusement, c'est exactement ce que fait le code de test. Ainsi, par exemple, je peux exécuter l'autotest de rspec dans deux fenêtres :
$ RAILS_DB=SQLite autotest
et
$ RAILS_DB=PostgreSQL autotest
Maintenant, je peux pirater mes fichiers et l'autotest m'alertera discrètement si j'ai cassé quoi que ce soit au fur et à mesure.