rake db:migrate db:resetとdb:schema:loadの違い


619

違いrake db:migrateとは、rake db:reset私の頭の中ではかなり明白です。わからないのrake db:schema:loadは前の2つとはどう違うのか。

私が同じページにいることを確認するだけです:

  • rake db:migrate -まだ実行されていないマイグレーションを実行します。
  • rake db:reset-データベースをクリアし(おそらくrake db:drop+ rake db:create+ rake db:migrateを実行)、新しいデータベースで移行を実行します。

私の理解が間違っていた場合、明確にするのを助けてください。


10
DOESのrake --tasksヘルプ?
zx1986 '28

このブログをチェックしてください。jacopretorius.net/2014/02/…–
Bishisht Bhatta

あなたの理解rake db:migrateは正しいですが、あなたの理解rake db:resetは間違っています。モリッツからの一番上の答えを見てください。
マグネ2017年

1
ところで、Railsの5のように、これらのコマンドは、のように呼び出すことができrails db:migraterails db:resetrails db:schema:loadstackoverflow.com/questions/38403533/…を
Purplejacket

回答:


1303
  • db:migrateは、まだ実行されていない(単一の)移行を実行します。
  • db:createはデータベース作成します
  • db:dropはデータベースを削除します
  • db:schema:loadは、schema.rbに従って(既存の)データベース内にテーブルと列を作成します

  • db:setupはdb:create、db:schema:load、db:seedを実行します

  • db:resetはdb:drop、db:setupを実行します
  • db:migrate:resetはdb:drop、db:create、db:migrateを実行します

通常、新しい移行ファイルを使用してスキーマに変更を加えた後、db:migrateを使用します(これは、データベースにすでにデータがある場合にのみ意味があります)。アプリの新しいインスタンスをセットアップするときにdb:schema:loadが使用されます。

お役に立てば幸いです。


レール3.2.12の更新:

ソースを確認したところ、依存関係は次のようになりました。

  • db:createは、現在の環境のデータベースを作成します
  • db:create:allは、すべての環境のデータベースを作成します
  • db:dropは現在の環境のデータベースを削除します
  • db:drop:allは、すべての環境のデータベースを削除します
  • db:migrateは、まだ実行されていない現在の環境の移行を実行します
  • db:migrate:upは1つの特定の移行を実行します
  • db:migrate:downは特定の1つの移行をロールバックします
  • db:migrate:statusは現在の移行ステータスを示します
  • db:rollbackは最後のマイグレーションをロールバックします
  • db:forwardは現在のスキーマバージョンを次のバージョンに進めます
  • db:seed(のみ)はdb / seed.rbファイルを実行します
  • db:schema:loadは現在の環境のデータベースにスキーマをロードします
  • db:schema:dumpは現在の環境のスキーマをダンプします(データベースも作成しているようです)

  • db:setupはdb:schema:load、db:seedを実行します

  • db:resetはdb:drop db:setupを実行します
  • db:migrate:redoは、指定された移行に応じて(db:migrate:down db:migrate:up)または(db:rollback db:migrate)を実行します
  • db:migrate:resetはdb:drop db:create db:migrateを実行します

詳細については、https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake(Rails 3.2.xの場合)およびhttps:// githubご覧ください。.com / rails / rails / blob / v4.0.5 / activerecord / lib / active_record / railties / databases.rake(Rails 4.0.xの場合)


16
ここで答えを持つファイルは、:)です- github.com/rails/rails/blob/master/activerecord/lib/...
cutalion

3
@cutation:db:setupは、db:migrateを実行しません。これは、dbセットアップだけですべての移行を実行するのは非常に脆弱であるためです(これがschema.rbの目的です)。
moritz

2
私はdb:resetを実行していて、それは私のdbをシードしています。なぜでしょうか?
アレハンドロリーデル

db:create必要に応じてdb:setupも実行されます。少なくともレール4.0.2以降。
Dan

保留中の移行があるrake db:migrate場合、Rails 4は呼び出し時に実行しますrake db:setupが、保留中の移行は実行しません。
Pooyan Khosravi 2014年

24

TLDR

使用する

  • rake db:migrate スキーマを変更したい場合
  • rake db:resetデータベースを削除する場合はschema.rb、からスキーマを再ロードして、データベースを再シードします
  • rake db:schema:loadschema.rb(これによりすべてのデータが削除されます)のようにデータベースをスキーマにリセットする場合

解説

rake db:schema:loadschema.rbファイルで提供されるスキーマをセットアップします。これは、それほど時間をかけないため、アプリの新規インストールに役立ちます。db:migrate

重要な注意、サーバー上のデータdb:schema:load削除します。

rake db:migrate既存のスキーマを変更します。スキーマのバージョンを作成するようなものです。rubyファイルdb:migrateを探し、db/migrate/まだ実行されていないマイグレーションを最も古いものから実行します。Railsは、移行ファイル名の先頭のタイムスタンプを調べることにより、どのファイルが最も古いかを認識します。db:migrateデータもデータベースに入れることができるという利点があります。これは実際には良い習慣ではありません。rake db:seedデータを追加するために使用する方が良いです。

rake db:migrateなどのコマンドを有効にし、最も便利なコマンドにするタスクupdownなどを提供しますrake db:rollback

rake db:resetないdb:dropdb:setup
シード・データでは、スキーマを再作成の負荷、データベースをドロップし、初期化

databases.rakeからのコマンドの関連部分


namespace :schema do
  desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
  task :dump => [:environment, :load_config] do
    require 'active_record/schema_dumper'
    filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
    File.open(filename, "w:utf-8") do |file|
      ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
    end
    db_namespace['schema:dump'].reenable
  end

  desc 'Loads a schema.rb file into the database'
  task :load => [:environment, :load_config, :check_protected_environments] do
    ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
  end

  # desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
  task :reset => [ 'db:drop', 'db:setup' ]

namespace :migrate do
  # desc  'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
  task :redo => [:environment, :load_config] do
    if ENV['VERSION']
      db_namespace['migrate:down'].invoke
      db_namespace['migrate:up'].invoke
    else
      db_namespace['rollback'].invoke
      db_namespace['migrate'].invoke
    end
  end

したがって、db:schema:load(一連の以前の移行から作成されたもの)を使用して本番スキーマを作成する場合、将来的に実行する必要のない移行(初期schema.rbの作成に参加したもの)を知ることができますdb:migrateの呼び出し?
CanadaIT 2017

2

私が理解している限り、データベースは削除され、db/schema.rbファイルに基づいて再作成されます。そのため、schema.rbファイルが常に最新でバージョン管理されていることを確認する必要があります。


0

Active RecordのRakeタスクは、このファイルのようにそこに住んでいると思うので、単純に調べることができます。 https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb

彼らはあなたの質問は正しいですか?

それは彼らがどこから来たかに依存し、これはそれらがタスクに応じて変化することを示すための単なる例です。ここには、タスクでいっぱいの別のファイルがあります。

https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile

これらのタスクがあります。

namespace :db do
  task create: ["db:mysql:build", "db:postgresql:build"]
  task drop: ["db:mysql:drop", "db:postgresql:drop"]
end

これはあなたの質問に答えないかもしれませんが、先に進み、特にrakeファイルとタスクについてソースを見る洞察を与えるかもしれません。彼らはあなたがレールを使うのを手伝うのにかなり良い仕事をしているので、彼らはいつもそのようにコードを文書化するわけではありません。それが何をすることになっているのかを知っていれば、私たちは皆そこで助けることができます。


削除される場合は、記事の関連部分を引用してください。理由を説明せずに何かをすることを勧めないでください。
PhilT

0

Rails 5で更新:

db:create-現在のRAILS_ENV環境のデータベースを作成します。RAILS_ENVが指定されていない場合、デフォルトで開発およびテストデータベースになります。

db:create:all -すべての環境のデータベースを作成します。

db:drop-現在のRAILS_ENV環境のデータベースを削除します。RAILS_ENVが指定されていない場合、デフォルトで開発およびテストデータベースになります。

db:drop:all -すべての環境のデータベースを削除します。

db:migrate-まだ実行されていない現在の環境の移行を実行します。デフォルトでは、開発環境でのみ移行が実行されます。

db:migrate:redo- 指定した移行に応じて、db:migrate:downおよびdb:migrate:upまたはdb:migrate:rollbackおよびdb:migrate:upを実行します。

db:migrate:up -指定された移行バージョンのアップを実行します。

db:migrate:down -指定された移行バージョンのダウンを実行します。

db:migrate:status -現在の移行ステータスを表示します。

db:migrate:rollback -最後の移行をロールバックします。

db:version -現在のスキーマバージョンを出力します。

db:forward -スキーマを次のバージョンにプッシュします。

db:seed-db / seeds.rbを実行しますファイルをます。

db:schema:loadschema.rbからデータベースを再作成しますファイルます。

db:schema:dump現在の環境のスキーマをdb / schema.rbにダンプします

db:structure:load-からデータベースを再作成structure.sqlファイルが。

db:structure:dump-現在の環境のスキーマをdb / structure.sqlにダンプします。(別のファイルを指定してSCHEMA=db/my_structure.sql

db:setupランは、DB:作成しデシベル:スキーマ:負荷デシベル:種子を

db:resetdb:dropdb:setupを実行します-db:dropdb:createdb:migrate:reset実行 DB:移行を

db:test:prepare-保留中の移行を確認し、テストスキーマを読み込みます。(引数なしでrakeを実行すると、デフォルトでこれが実行されます。)

db:test:clone -現在の環境のデータベーススキーマからテストデータベースを再作成します。

db:test:clone_structure-db:test:cloneと同様ますが、テストデータベースが現在の環境のデータベースと同じ構造(文字セットと照合を含む)であることを確認します。

db:environment:set-現在設定しRAILS_ENVの環境をar_internal_metadataテーブルにます。(保護環境チェックの一部として使用されます。)

db:check_protected_environments-現在のRAILS_ENV環境で破壊的なアクションを実行できるかどうかを確認します。db:dropdb:schema:loadなどの破壊的なアクションを実行するときに内部的に使用されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.