sql >> Database >  >> RDS >> Mysql

RoR:hoe test ik mijn app tegen meerdere databases?

@awendt wees er vriendelijk op dat ik mijn eigen vraag kon beantwoorden.

Het recept blijkt vrij eenvoudig te zijn. Het geheim is om een ​​omgevingsvariabele te gebruiken om Rails te vertellen welke db je wilt gebruiken.

1. Uw bestanden wijzigen

In config/database.yml , neem ERB-constructies als volgt op:

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

Opmerking 1:ik heb het alleen getoond voor de testomgeving. In feite is dat de enige die ik heb gewijzigd, aangezien het (vermoedelijk) voldoende dekking biedt om me te vertellen of alle drie de databases goed worden ondersteund.

Opmerking 2:U hoeft geen omgevingsvariabelen te gebruiken om gebruikersnaam en wachtwoord in te stellen -- dat is gewoon iets wat ik het liefst doe, omdat het voorkomt dat wachtwoorden worden weergegeven in een veelgebruikt bestand.

Breid Gemfile op dezelfde manier als volgt uit (merk op dat uw versienummers kunnen variëren):

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. Voeg voorwaarden toe aan je code

Ondanks de inspanningen van het Rails-ontwikkelingsteam, zijn er een paar plekken waar ActiveRecord-constructies niet compatibel zijn met alle soorten databases. In deze gevallen kunt u uw code conditioneren op ActiveRecord::Base.connection.adapter_name . Hier is een voorbeeld van een van mijn migratiebestanden:

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. Hardlopen en testen

Je kunt nu een database selecteren door simpelweg de RAILS_DB omgevingsvariabele in te stellen, maar er is een addertje onder het gras:je moet bundle install uitvoeren elke keer om de juiste database-adapter in te stellen vanuit de Gemfile. Gelukkig is dat precies wat de testcode doet. Ik kan bijvoorbeeld de autotest van rspec in twee vensters uitvoeren:

$ RAILS_DB=SQLite autotest

en

$ RAILS_DB=PostgreSQL autotest

Nu kan ik mijn bestanden hacken en autotest zal me stilletjes waarschuwen als ik iets heb gebroken terwijl ik bezig ben.




  1. Prestaties van mysql verbeteren LOAD DATA / mysqlimport?

  2. Voeg unieke reeksen van 8 willekeurige tekens in

  3. SQL TUSSEN-operator voor beginners

  4. Haal de laatst ingevoegde 10 rijen op in de tabel