sql >> Databasteknik >  >> RDS >> Mysql

RoR:hur testar jag min app mot flera databaser?

@awendt påpekade vänligt att jag kunde svara på min egen fråga.

Det visar sig att receptet är ganska enkelt. Hemligheten är att använda en miljövariabel för att tala om för Rails vilken db du vill använda.

1. Ändra dina filer

I config/database.yml , inkludera ERB-konstruktioner så här:

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:Jag har bara visat det för testmiljön. Det är faktiskt den enda jag har modifierat, eftersom den (förmodligen) ger tillräckligt med täckning för att tala om för mig om alla tre databaserna stöds korrekt.

Note 2:Du behöver inte använda miljövariabler för att ställa in användarnamn och lösenord -- det är bara något jag föredrar att göra eftersom det undviker att exponera lösenord i en vanlig fil.

På samma sätt utökar du Gemfile enligt följande (observera att dina versionsnummer kan variera):

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. Lägg till villkor i din kod

Trots de bästa ansträngningarna från Rails utvecklingsteam, finns det några ställen där ActiveRecord-konstruktioner inte är kompatibla med alla varianter av databasen. I dessa fall kan du villkora din kod på ActiveRecord::Base.connection.adapter_name . Här är ett exempel från en av mina 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ör och testar

Du kan nu välja en databas helt enkelt genom att ställa in miljövariabeln RAILS_DB, men det finns en hake:du måste köra bundle install varje gång för att ställa in lämplig databasadapter från Gemfilen. Lyckligtvis är det precis vad testkoden gör. Så, till exempel, kan jag köra rspecs autotest i två fönster:

$ RAILS_DB=SQLite autotest

och

$ RAILS_DB=PostgreSQL autotest

Nu kan jag hacka iväg på mina filer och autotestet varnar mig tyst om jag har brutit något medan jag går.




  1. SQL-server villkorlig anslutning

  2. Varför misslyckas min ODBC-anslutning när jag kör en SSIS-laddning i Visual Studio men inte när jag kör samma paket med Execute Package Utility

  3. Mysql-fråga för att dynamiskt konvertera rader till kolumner på basis av två kolumner

  4. Skicka värden till MySQL IN-drift i PDO-förberedd uttalande?