@awendt wies freundlicherweise darauf hin, dass ich meine eigene Frage beantworten könnte.
Es stellt sich heraus, dass das Rezept ziemlich einfach ist. Das Geheimnis besteht darin, eine Umgebungsvariable zu verwenden, um Rails mitzuteilen, welche Datenbank Sie verwenden möchten.
1. Ändern Ihrer Dateien
In config/database.yml
, schließen Sie ERB-Konstrukte wie diese ein:
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 %>
Anmerkung 1:Ich habe es nur für die Testumgebung gezeigt. Tatsächlich ist dies die einzige, die ich geändert habe, da sie (angeblich) genügend Abdeckung bietet, um mir zu sagen, ob alle drei Datenbanken richtig unterstützt werden.
Anmerkung 2:Sie müssen keine Umgebungsvariablen verwenden, um Benutzername und Passwort festzulegen – das ist etwas, was ich lieber tue, da es die Offenlegung von Passwörtern in einer häufig angezeigten Datei vermeidet.
Erweitern Sie Gemfile auf ähnliche Weise wie folgt (beachten Sie, dass Ihre Versionsnummern variieren können):
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. Bedingungen zu Ihrem Code hinzufügen
Trotz aller Bemühungen des Rails-Entwicklungsteams gibt es ein paar Stellen, an denen ActiveRecord-Konstrukte nicht mit allen Arten von Datenbanken kompatibel sind. In diesen Fällen können Sie Ihren Code auf ActiveRecord::Base.connection.adapter_name
konditionieren . Hier ist ein Beispiel aus einer meiner Migrationsdateien:
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. Ausführen und Testen
Sie können jetzt eine Datenbank auswählen, indem Sie einfach die Umgebungsvariable RAILS_DB setzen, aber es gibt einen Haken:Sie müssen bundle install
ausführen jedes Mal, um den entsprechenden Datenbankadapter aus dem Gemfile einzurichten. Glücklicherweise macht der Testcode genau das. So kann ich beispielsweise den Autotest von rspec in zwei Fenstern ausführen:
$ RAILS_DB=SQLite autotest
und
$ RAILS_DB=PostgreSQL autotest
Jetzt kann ich meine Dateien hacken und Autotest wird mich unauffällig warnen, wenn ich etwas kaputt mache, während ich fortfahre.