@awendt wees er vriendelijk op dat ik mijn eigen vraag kon beantwoorden.
Het recept blijkt vrij eenvoudig te zijn. Het geheim is om een omgevingsvariabele te gebruiken om Rails te vertellen welke db je wilt gebruiken.
1. Uw bestanden wijzigen
In config/database.yml
, neem ERB-constructies als volgt op:
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 %>
Opmerking 1:ik heb het alleen getoond voor de testomgeving. In feite is dat de enige die ik heb gewijzigd, aangezien het (vermoedelijk) voldoende dekking biedt om me te vertellen of alle drie de databases goed worden ondersteund.
Opmerking 2:U hoeft geen omgevingsvariabelen te gebruiken om gebruikersnaam en wachtwoord in te stellen -- dat is gewoon iets wat ik het liefst doe, omdat het voorkomt dat wachtwoorden worden weergegeven in een veelgebruikt bestand.
Breid Gemfile op dezelfde manier als volgt uit (merk op dat uw versienummers kunnen variëren):
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. Voeg voorwaarden toe aan je code
Ondanks de inspanningen van het Rails-ontwikkelingsteam, zijn er een paar plekken waar ActiveRecord-constructies niet compatibel zijn met alle soorten databases. In deze gevallen kunt u uw code conditioneren op ActiveRecord::Base.connection.adapter_name
. Hier is een voorbeeld van een van mijn migratiebestanden:
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. Hardlopen en testen
Je kunt nu een database selecteren door simpelweg de RAILS_DB omgevingsvariabele in te stellen, maar er is een addertje onder het gras:je moet bundle install
uitvoeren elke keer om de juiste database-adapter in te stellen vanuit de Gemfile. Gelukkig is dat precies wat de testcode doet. Ik kan bijvoorbeeld de autotest van rspec in twee vensters uitvoeren:
$ RAILS_DB=SQLite autotest
en
$ RAILS_DB=PostgreSQL autotest
Nu kan ik mijn bestanden hacken en autotest zal me stilletjes waarschuwen als ik iets heb gebroken terwijl ik bezig ben.