@awendt påpekade vänligt att jag kunde svara på min egen fråga.
Det visar sig att receptet är ganska enkelt. Hemligheten är att använda en miljövariabel för att tala om för Rails vilken db du vill använda.
1. Ändra dina filer
I config/database.yml
, inkludera ERB-konstruktioner så här:
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:Jag har bara visat det för testmiljön. Det är faktiskt den enda jag har modifierat, eftersom den (förmodligen) ger tillräckligt med täckning för att tala om för mig om alla tre databaserna stöds korrekt.
Note 2:Du behöver inte använda miljövariabler för att ställa in användarnamn och lösenord -- det är bara något jag föredrar att göra eftersom det undviker att exponera lösenord i en vanlig fil.
På samma sätt utökar du Gemfile enligt följande (observera att dina versionsnummer kan variera):
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. Lägg till villkor i din kod
Trots de bästa ansträngningarna från Rails utvecklingsteam, finns det några ställen där ActiveRecord-konstruktioner inte är kompatibla med alla varianter av databasen. I dessa fall kan du villkora din kod på ActiveRecord::Base.connection.adapter_name
. Här är ett exempel från en av mina 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ör och testar
Du kan nu välja en databas helt enkelt genom att ställa in miljövariabeln RAILS_DB, men det finns en hake:du måste köra bundle install
varje gång för att ställa in lämplig databasadapter från Gemfilen. Lyckligtvis är det precis vad testkoden gör. Så, till exempel, kan jag köra rspecs autotest i två fönster:
$ RAILS_DB=SQLite autotest
och
$ RAILS_DB=PostgreSQL autotest
Nu kan jag hacka iväg på mina filer och autotestet varnar mig tyst om jag har brutit något medan jag går.