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をロードすることの違いは何ですか?
これらのタスクはどれだけ似ている(または異なる)のか?
とても良い質問です。困ったので、Railsソースに飛び込み、プルアップしました database.rake
。
db:test:clone
はdb:schema:dump
とdb: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:load
はdb: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
名前空間の先頭の行に移動します。
実際にはまったく同じものではありません。 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