2011-10-07 10 views
65

ruby​​onrails.orgに関する正式な説明は、レールとデータベースの初心者にとっては、これら4つのタスクのすべてが正確に同じであると認めなければなりません。引用:db:test:clone、db:test:clone_structure、db:test:load、およびdb:test:prepareの違いは何ですか?

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の読み込みの違いは何ですか?

これらのタスクはどれぐらい似ていますか?

答えて

61

非常に良い質問です。私が困惑したので、私はレールソースにびっくりして、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:load(schema.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名前空間の先頭にある行に移動します。

+0

ボトムライン:ほとんど同じことです。 :-p – bricker

+0

warning - 私はdb:test:クローンが正しく私の開発データベースからの列のNULL可能性をコピーしていないことがわかりました。これは、Rails 2.3.12を使用して見つけたので、その後修正された古いバグかもしれません。 –

20

実際には全く同じではありません。 「schema」という単語を含むこれらのタスクは、.../db/schema.rbファイルに作用します。 schema.rbは、すべての移行を適用した後のスキーマの状態です。すべてのdbマイグレーションを実行するのではなく、スキーマをリストアするために実行することができます(多くのマイグレーションがある場合は時間がかかります)。

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

Railsは、あなたが

config.active_record.schema_format =設定したかどうかに基づいて、schema.rbルートやstructure.sqlのルートを移動するかどうかを知っている:SQL

をあなたに... /config/application.rb

+1

上記のbrickerの答えに優れた拡張 - ありがとう! –

+0

トリガ、関数、ストアドプロシージャなど、異なるものの例を示します。 (なぜ我々はまだ構造を使用して立ち往生しているのですか)。 –

関連する問題