Mysql
 sql >> Baza danych >  >> RDS >> Mysql

RoR:jak przetestować moją aplikację w wielu bazach danych?

@awendt uprzejmie wskazał, że mogę odpowiedzieć na własne pytanie.

Okazuje się, że przepis jest dość prosty. Sekret polega na użyciu zmiennej środowiskowej, aby poinformować Railsy, ​​której bazy danych chcesz użyć.

1. Modyfikowanie plików

W config/database.yml , dołącz konstrukcje ERB takie jak:

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

Uwaga 1:Pokazałem to tylko dla środowiska testowego. W rzeczywistości jest to jedyny, który zmodyfikowałem, ponieważ (podobno) zapewnia wystarczający zasięg, aby powiedzieć mi, czy wszystkie trzy bazy danych są prawidłowo obsługiwane.

Uwaga 2:Nie musisz używać zmiennych środowiskowych do ustawienia nazwy użytkownika i hasła — to po prostu coś, co wolę robić, ponieważ pozwala to uniknąć ujawniania haseł w często przeglądanym pliku.

Podobnie rozszerz Gemfile w następujący sposób (zwróć uwagę, że numery wersji mogą się różnić):

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. Dodaj warunki do swojego kodu

Pomimo najlepszych wysiłków zespołu programistów Rails, jest kilka miejsc, w których konstrukcje ActiveRecord nie są kompatybilne we wszystkich odmianach bazy danych. W takich przypadkach możesz uzależnić swój kod od ActiveRecord::Base.connection.adapter_name . Oto przykład z jednego z moich plików migracji:

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. Bieganie i testowanie

Możesz teraz wybrać bazę danych, po prostu ustawiając zmienną środowiskową RAILS_DB, ale jest pewien haczyk:musisz uruchomić bundle install za każdym razem, aby skonfigurować odpowiedni adapter bazy danych z pliku Gemfile. Na szczęście dokładnie to robi kod testowy. Na przykład mogę uruchomić autotest rspec w dwóch oknach:

$ RAILS_DB=SQLite autotest

i

$ RAILS_DB=PostgreSQL autotest

Teraz mogę włamać się do moich plików, a autotest po cichu ostrzeże mnie, jeśli coś zepsułem.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL concat() do tworzenia nazw kolumn do użycia w zapytaniu?

  2. jak ustawić tablicę jako zmienną użytkownika mysql

  3. jak zaktualizować mysql za pomocą php podczas odejmowania

  4. Jak używać klucza obcego podczas wykonywania zapytań z dwóch tabel

  5. Dlaczego SQLAlchemy create_engine z charset=utf8 zwraca typ Pythona <str> i nie wpisuje <unicode>?