RoR: как я могу проверить свое приложение на нескольких базах данных? - PullRequest
2 голосов
/ 15 марта 2011

Я начал развертывать мое последнее приложение RoR на Heroku, что потребовало от меня начать использовать PostgreSQL - раньше я использовал SQLite и MySQL. Мне нужен очень простой способ непрерывного тестирования красного / зеленого на всех трех базах данных, чтобы убедиться, что я ничего не сломал в пылу разработки.

Какой хороший способ сделать это?

1 Ответ

0 голосов
/ 06 апреля 2012

@ awendt любезно указал, что я могу ответить на свой вопрос.

Оказывается, рецепт довольно прост.Секрет в том, чтобы использовать переменную окружения, чтобы сообщить Rails, какую БД вы хотите использовать.

1.Изменение ваших файлов

В config/database.yml включите конструкции ERB, например:

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

Примечание 1. Я показал это только для тестовой среды.Фактически, это единственное, что я изменил, поскольку (предположительно) он обеспечивает достаточный охват, чтобы сказать мне, все ли три базы данных поддерживаются должным образом.

Примечание 2: Вам не нужно использовать переменные среды дляустановить имя пользователя и пароль - это то, что я предпочитаю делать, так как это позволяет избежать раскрытия паролей в часто просматриваемом файле.

Аналогично, расширьте Gemfile следующим образом (обратите внимание, что номера версий могут отличаться):

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.Добавьте условия к своему коду

Несмотря на все усилия команды разработчиков Rails, есть несколько моментов, когда конструкции ActiveRecord не совместимы со всеми разновидностями базы данных.В этих случаях вы можете указать свой код на ActiveRecord::Base.connection.adapter_name.Вот пример из одного из моих файлов миграции:

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.Запуск и тестирование

Теперь вы можете выбрать базу данных, просто установив переменную среды RAILS_DB, но есть одна загвоздка: вам нужно каждый раз запускать bundle install, чтобы настроить соответствующий адаптер базы данных из Gemfile.К счастью, именно это и делает тестовый код.Так, например, я могу запустить автотест rspec в двух окнах:

$ RAILS_DB=SQLite autotest

и

$ RAILS_DB=PostgreSQL autotest

Теперь я могу взломать мои файлы, и автотест тихо предупредит меня, если я 'Я сломал что-нибудь, пока я иду вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...