@awendt påpegede venligt, at jeg kunne svare på mit eget spørgsmål.
Det viser sig, at opskriften er ret simpel. Hemmeligheden er at bruge en miljøvariabel til at fortælle Rails, hvilken db du vil bruge.
1. Ændring af dine filer
I config/database.yml
, inkludere ERB-konstruktioner som denne:
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 %>
Note 1:Jeg har kun vist det for testmiljøet. Faktisk er det den eneste, jeg har ændret, da den (angiveligt) giver nok dækning til at fortælle mig, om alle tre databaser er korrekt understøttet.
Note 2:Du behøver ikke bruge miljøvariabler til at indstille brugernavn og adgangskode -- det er bare noget, jeg foretrækker at gøre, da det undgår at afsløre adgangskoder i en almindeligt vist fil.
Udvid Gemfile på samme måde som følger (bemærk, at dine versionsnumre kan variere):
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. Tilføj betingelser til din kode
På trods af den bedste indsats fra Rails-udviklingsteamet er der nogle få steder, hvor ActiveRecord-konstruktioner ikke er kompatible på tværs af alle varianter af databasen. I disse tilfælde kan du betinge din kode på ActiveRecord::Base.connection.adapter_name
. Her er et eksempel fra en af mine migreringsfiler:
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. Kørsel og test
Du kan nu vælge en database ved blot at indstille RAILS_DB miljøvariablen, men der er en hake:du skal køre bundle install
hver gang for at konfigurere den relevante databaseadapter fra Gemfilen. Heldigvis er det præcis, hvad testkoden gør. Så for eksempel kan jeg køre rspecs autotest i to vinduer:
$ RAILS_DB=SQLite autotest
og
$ RAILS_DB=PostgreSQL autotest
Nu kan jeg hacke mine filer væk, og autotest vil stille og roligt advare mig, hvis jeg har ødelagt noget, mens jeg går.