web-dev-qa-db-ja.com

db:test:clone、db:test:clone_structure、db:test:load、db:test:prepareの違いは何ですか?

Railsおよびデータベースの初心者には、rubyonrails.orgの公式説明により、これら4つのタスクすべてがまったく同じように聞こえることを認める必要があります。

rake db:test:clone  Recreate the test database from
                    the current environment’s database schema

rake db:test:clone_structure    Recreate the test database from the
                                development structure

rake db:test:load   Recreate the test database from the current schema.rb

rake db:test:prepare    Check for pending migrations and load the test schema

構造とスキーマの違いすら知らない。そして、現在の環境のスキーマをロードすることと、schema.rbをロードすることの違いは何ですか?

これらのタスクはどれだけ似ている(または異なる)のか?

70
Nate Berkopec

とても良い質問です。困ったので、Railsソースに飛び込み、プルアップしました database.rake

  • db:test:clonedb:schema:dumpdb:test:loadの単なる組み合わせです:

    task :clone => %w(db:schema:dump db:test:load)
    
  • db:test:clone_structure{Rails_env}_structure.sqlファイルを使用します。

    task :clone_structure => [ 'db:structure:dump', 'db:test:purge' ] do
      # skipped some code, here's what happens for MySQL:
      ActiveRecord::Base.establish_connection(:test)
      # ...
      IO.readlines("#{Rails.root}/db/#{Rails.env}_structure.sql").join.split("\n\n").each do |table|
        ActiveRecord::Base.connection.execute(table)
      end
    end
    
  • db:test:loaddb:schema:loadと同じですが、テストデータベースで呼び出します:

    task :load => 'db:test:purge' do
      ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
      # ...
      db_namespace['schema:load'].invoke
    end
    
  • db:test:prepareは、移行が保留されている場合に警告し、保留されていない場合は、db:test:clone_structure{Rails_env}_structure.sqlファイルを使用)またはdb:test:loadschema.rbファイルを使用)を実行します、スキーマ形式に応じて(これは私を少し混乱させる、多分他の誰かがそれを拡張することができます):

    task :prepare => 'db:abort_if_pending_migrations' do
      # ...
      db_namespace[{ :sql  => 'test:clone_structure', :Ruby => 'test:load' }[ActiveRecord::Base.schema_format]].invoke
    end
    

これで解決することを願っています!繰り返しますが、 database.rake ファイルを調べるのは簡単で、他の質問があれば解決します。このリンクは、:test名前空間の先頭の行に移動します。

65
bricker

実際にはまったく同じものではありません。 Wordの「スキーマ」を含むこれらのタスクは、.../db/schema.rbファイルに作用します。 schema.rbは、すべての移行を適用した後のスキーマの状態です。すべてのdb移行を実行するのではなく、スキーマを復元するために実行できます(移行が多い場合は時間がかかることがあります)。

Wordの「構造」を持つタスクは、{Rails.env} _structure.sqlファイルに基づいて動作します。このファイルは、schema.rbファイルで表現できない構造がスキーマに含まれている場合に使用されます。たとえば、特定のRDBMSに固有の機能を使用する場合。裏では、Railsは、RDBMSに適したスキーマダンプユーティリティを使用してこのファイルを生成します。スキーマを復元するには、ファイルを読み取り、RDBMS固有のツールを使用してSQLステートメントを再度実行します。

Railsは、設定したかどうかに基づいてschema.rbルートまたはstructure.sqlルートのどちらに行くかを知っています

config.active_record.schema_format =:sql

.../config/application.rb

21
brian