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
structureと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
これでスッキリしたでしょうか?もう一度
データベース.rake
ファイルを見るのは簡単で、他の質問もクリアになるでしょう。そのリンク先は
:test
の名前空間の始まりである行に行きます。
関連
-
[解決済み】識別関係と非識別関係の違いとは?
-
[解決済み] 変更欄のRailsマイグレーション
-
[解決済み] heroku push rejected, failed to compile Ruby/rails app
-
[解決済み] Ruby on Railsでsimple_formを使うさまざまな方法|何が違うの?
-
[解決済み] Herokuの問題 : あなたが探しているページは存在しません。
-
[解決済み] Railsです。gemを使った特定バージョンのライブラリのアンインストール
-
[解決済み] フェイク、モッキング、スタビングの違いとは?
-
[解決済み] rake db:migrate db:reset とdb:schema:loadの違いについて
-
[解決済み] データベース駆動型アプリケーションのユニットテストに最適な戦略とは?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】なぜRuby on Railsは、http://localhost:3000 の代わりに http://0.0.0.0:3000 を使用するのですか?
-
[解決済み】Webpacker::Manifest::MissingEntryError【クローズド
-
[解決済み] 該当するルートがない [GET] "demo/hello"
-
[解決済み] PG::ConnectionBad - サーバーに接続できませんでした。接続が拒否されました。
-
[解決済み] Oauth2 Instagram API "リダイレクトURIが登録されたリダイレクトURIと一致しない"
-
[解決済み] nil:NilClass の未定義メソッド `each' - しかし、なぜ?
-
[解決済み] Ruby:Rubyの配列にinclude.の反対はある?
-
[解決済み] RubyとRailsの "Date.today "フォーマット
-
[解決済み] Railsでグループとカウント
-
[解決済み] RSpecとCucumberの違いは何ですか?[クローズド]