@awendt uprzejmie wskazał, że mogę odpowiedzieć na własne pytanie.
Okazuje się, że przepis jest dość prosty. Sekret polega na użyciu zmiennej środowiskowej, aby poinformować Railsy, której bazy danych chcesz użyć.
1. Modyfikowanie plików
W config/database.yml
, dołącz konstrukcje ERB takie jak:
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 %>
Uwaga 1:Pokazałem to tylko dla środowiska testowego. W rzeczywistości jest to jedyny, który zmodyfikowałem, ponieważ (podobno) zapewnia wystarczający zasięg, aby powiedzieć mi, czy wszystkie trzy bazy danych są prawidłowo obsługiwane.
Uwaga 2:Nie musisz używać zmiennych środowiskowych do ustawienia nazwy użytkownika i hasła — to po prostu coś, co wolę robić, ponieważ pozwala to uniknąć ujawniania haseł w często przeglądanym pliku.
Podobnie rozszerz Gemfile w następujący sposób (zwróć uwagę, że numery wersji mogą się różnić):
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. Dodaj warunki do swojego kodu
Pomimo najlepszych wysiłków zespołu programistów Rails, jest kilka miejsc, w których konstrukcje ActiveRecord nie są kompatybilne we wszystkich odmianach bazy danych. W takich przypadkach możesz uzależnić swój kod od ActiveRecord::Base.connection.adapter_name
. Oto przykład z jednego z moich plików migracji:
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. Bieganie i testowanie
Możesz teraz wybrać bazę danych, po prostu ustawiając zmienną środowiskową RAILS_DB, ale jest pewien haczyk:musisz uruchomić bundle install
za każdym razem, aby skonfigurować odpowiedni adapter bazy danych z pliku Gemfile. Na szczęście dokładnie to robi kod testowy. Na przykład mogę uruchomić autotest rspec w dwóch oknach:
$ RAILS_DB=SQLite autotest
i
$ RAILS_DB=PostgreSQL autotest
Teraz mogę włamać się do moich plików, a autotest po cichu ostrzeże mnie, jeśli coś zepsułem.