Mysql
 sql >> Datenbank >  >> RDS >> Mysql

RoR:Wie teste ich meine App gegen mehrere Datenbanken?

@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.