Mysql
 sql >> Base de données >  >> RDS >> Mysql

RoR :comment tester mon application sur plusieurs bases de données ?

@awendt a gentiment fait remarquer que je pouvais répondre à ma propre question.

Il s'avère que la recette est assez simple. Le secret est d'utiliser une variable d'environnement pour indiquer à Rails quelle base de données vous souhaitez utiliser.

1. Modification de vos fichiers

Dans config/database.yml , incluez des constructions ERB comme ceci :

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 %>

Remarque 1 :je ne l'ai montré que pour l'environnement de test. En fait, c'est la seule que j'ai modifiée, car (soi-disant) elle fournit une couverture suffisante pour me dire si les trois bases de données sont correctement prises en charge.

Remarque 2 :Vous n'avez pas besoin d'utiliser des variables d'environnement pour définir le nom d'utilisateur et le mot de passe. C'est simplement quelque chose que je préfère faire car cela évite d'exposer les mots de passe dans un fichier couramment consulté.

De même, étendez Gemfile comme suit (notez que vos numéros de version peuvent varier) :

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. Ajoutez des conditions à votre code

Malgré les meilleurs efforts de l'équipe de développement Rails, il existe quelques endroits où les constructions ActiveRecord ne sont pas compatibles avec toutes les saveurs de base de données. Dans ces cas, vous pouvez conditionner votre code sur ActiveRecord::Base.connection.adapter_name . Voici un exemple tiré d'un de mes fichiers de migration :

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. Exécution et test

Vous pouvez maintenant sélectionner une base de données simplement en définissant la variable d'environnement RAILS_DB, mais il y a un hic :vous devez exécuter bundle install à chaque fois pour configurer l'adaptateur de base de données approprié à partir du Gemfile. Heureusement, c'est exactement ce que fait le code de test. Ainsi, par exemple, je peux exécuter l'autotest de rspec dans deux fenêtres :

$ RAILS_DB=SQLite autotest

et

$ RAILS_DB=PostgreSQL autotest

Maintenant, je peux pirater mes fichiers et l'autotest m'alertera discrètement si j'ai cassé quoi que ce soit au fur et à mesure.