1. ホーム
  2. ruby-on-rails

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

2023-10-26 13:44:50

質問

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

structureとschemaの違いもよくわからない。また、現在の環境のスキーマを読み込むのと、単にschema.rbを読み込むのと、何が違うのでしょうか?

これらのタスクはどの程度似ている(または異なっている)のでしょうか?

どのように解決するのですか?

とても良い質問ですね。私は困っていたので、railsのソースに飛び込み、以下のものを引っ張り出してきました。 database.rake . これでより分かりやすくなりました。

  • db:test:clone は、単に db: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: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
    
    

これでスッキリしたでしょうか?もう一度 データベース.rake ファイルを見るのは簡単で、他の質問もクリアになるでしょう。そのリンク先は :test の名前空間の始まりである行に行きます。