sql >> データベース >  >> RDS >> Mysql

RoR:複数のデータベースに対してアプリをテストするにはどうすればよいですか?

    @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:テスト環境でのみ表示しています。実際、私が変更したのはこれだけです。これは、(おそらく)3つのデータベースすべてが適切にサポートされているかどうかを知るのに十分なカバレッジを提供するためです。

    注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でコードを調整できます。 。これが私の移行ファイルの1つからの例です:

    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から適切なデータベースアダプタを設定します。幸いなことに、それはまさにテストコードが行うことです。したがって、たとえば、2つのウィンドウでrspecの自動テストを実行できます。

    $ RAILS_DB=SQLite autotest
    

    および

    $ RAILS_DB=PostgreSQL autotest
    

    これで、ファイルをハックして、何かが壊れた場合は自動テストで静かに警告が表示されます。




    1. SQLエラー:ORA-00933:SQLコマンドが正しく終了していません

    2. PostgreSQLでのデータベースの一覧表示と切り替え

    3. 列のコピーをMySQLテーブルにすばやく追加する

    4. Laravel移行の自己参照外部キーの問題