Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

RoR:como faço para testar meu aplicativo em vários bancos de dados?


@awendt gentilmente apontou que eu poderia responder minha própria pergunta.

Acontece que a receita é bastante simples. O segredo é usar uma variável de ambiente para dizer ao Rails qual db você quer usar.

1. Modificando seus arquivos


Em config/database.yml , inclua construções ERB como esta:
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 %>

Nota 1:mostrei apenas para o ambiente de teste. Na verdade, esse é o único que modifiquei, já que (supostamente) ele fornece cobertura suficiente para me dizer se todos os três bancos de dados são suportados adequadamente.

Nota 2:Você não precisa usar variáveis ​​de ambiente para definir nome de usuário e senha -- isso é apenas algo que prefiro fazer, pois evita expor senhas em um arquivo comumente visualizado.

Da mesma forma, estenda o Gemfile da seguinte forma (observe que os números de sua versão podem variar):
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. Adicione condições ao seu código


Apesar dos melhores esforços da equipe de desenvolvimento do Rails, existem alguns pontos em que as construções do ActiveRecord não são compatíveis em todos os tipos de banco de dados. Nesses casos, você pode condicionar seu código em ActiveRecord::Base.connection.adapter_name . Aqui está um exemplo de um dos meus arquivos de migração:

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. Executando e testando


Agora você pode selecionar um banco de dados simplesmente definindo a variável de ambiente RAILS_DB, mas há um problema:você precisa executar bundle install cada vez para configurar o adaptador de banco de dados apropriado do Gemfile. Felizmente, é exatamente isso que o código de teste faz. Assim, por exemplo, posso executar o autoteste do rspec em duas janelas:
$ RAILS_DB=SQLite autotest

e
$ RAILS_DB=PostgreSQL autotest

Agora eu posso hackear meus arquivos e o autoteste me alertará silenciosamente se eu quebrar alguma coisa enquanto eu prossigo.