@awendt laskavě poukázal na to, že mohu odpovědět na svou vlastní otázku.
Ukázalo se, že recept je poměrně jednoduchý. Tajemství spočívá v použití proměnné prostředí, která Rails řekne, kterou db chcete použít.
1. Úprava souborů
V config/database.yml
, zahrnout ERB konstrukty, jako je tento:
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 %>
Poznámka 1:Ukázal jsem to pouze pro testovací prostředí. Ve skutečnosti je to jediná, kterou jsem upravil, protože (údajně) poskytuje dostatečné pokrytí, aby mi řeklo, zda jsou všechny tři databáze správně podporovány.
Poznámka 2:K nastavení uživatelského jména a hesla nepotřebujete používat proměnné prostředí – to je právě něco, co preferuji, protože se vyhne odhalení hesel v běžně prohlíženém souboru.
Podobně rozšiřte Gemfile následovně (všimněte si, že čísla verzí se mohou lišit):
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. Přidejte do kódu podmínky
Navzdory maximálnímu úsilí vývojového týmu Rails existuje několik míst, kde konstrukce ActiveRecord nejsou kompatibilní se všemi verzemi databáze. V těchto případech můžete svůj kód podmínit ActiveRecord::Base.connection.adapter_name
. Zde je příklad z jednoho z mých migračních souborů:
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. Spuštění a testování
Nyní můžete vybrat databázi jednoduše nastavením proměnné prostředí RAILS_DB, ale má to háček:musíte spustit bundle install
pokaždé nastavit příslušný databázový adaptér z Gemfile. Naštěstí přesně to dělá testovací kód. Mohu tedy například spustit autotest rspec ve dvou oknech:
$ RAILS_DB=SQLite autotest
a
$ RAILS_DB=PostgreSQL autotest
Nyní se mohu nabourat do svých souborů a autotest mě tiše upozorní, pokud jsem něco rozbil.