sql >> Database teknologi >  >> RDS >> Mysql

RoR:hvordan tester jeg min app mod flere databaser?

@awendt påpegede venligt, at jeg kunne svare på mit eget spørgsmål.

Det viser sig, at opskriften er ret simpel. Hemmeligheden er at bruge en miljøvariabel til at fortælle Rails, hvilken db du vil bruge.

1. Ændring af dine filer

I config/database.yml , inkludere ERB-konstruktioner som denne:

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

Note 1:Jeg har kun vist det for testmiljøet. Faktisk er det den eneste, jeg har ændret, da den (angiveligt) giver nok dækning til at fortælle mig, om alle tre databaser er korrekt understøttet.

Note 2:Du behøver ikke bruge miljøvariabler til at indstille brugernavn og adgangskode -- det er bare noget, jeg foretrækker at gøre, da det undgår at afsløre adgangskoder i en almindeligt vist fil.

Udvid Gemfile på samme måde som følger (bemærk, at dine versionsnumre kan variere):

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. Tilføj betingelser til din kode

På trods af den bedste indsats fra Rails-udviklingsteamet er der nogle få steder, hvor ActiveRecord-konstruktioner ikke er kompatible på tværs af alle varianter af databasen. I disse tilfælde kan du betinge din kode på ActiveRecord::Base.connection.adapter_name . Her er et eksempel fra en af ​​mine migreringsfiler:

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. Kørsel og test

Du kan nu vælge en database ved blot at indstille RAILS_DB miljøvariablen, men der er en hake:du skal køre bundle install hver gang for at konfigurere den relevante databaseadapter fra Gemfilen. Heldigvis er det præcis, hvad testkoden gør. Så for eksempel kan jeg køre rspecs autotest i to vinduer:

$ RAILS_DB=SQLite autotest

og

$ RAILS_DB=PostgreSQL autotest

Nu kan jeg hacke mine filer væk, og autotest vil stille og roligt advare mig, hvis jeg har ødelagt noget, mens jeg går.




  1. SQL Server:Isolationsniveau lækker på tværs af poolede forbindelser

  2. UPDATE-sætninger er i forespørgselssluttilstand

  3. send sql-fil til nodejs til udførelse som helhed

  4. mysql_query() forventer, at parameter 2 er ressource, streng givet i