web-dev-qa-db-ja.com

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

rake db:migraterake db:resetの違いは私の頭の中ではっきりしています。私が理解できないことは、rake db:schema:loadが前の2つとどう違うかということです。

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

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

私の理解が間違っていたら、明確にするのを手伝ってください。

574
Gaurav Agarwal
  • 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を使用します(これはデータベースにデータがすでに存在する場合にのみ意味があります)。 db:schema:loadは、アプリの新しいインスタンスを設定するときに使用されます。

それが役立つことを願っています。


Rails 3.2.12用のアップデート:

私はソースをチェックしたところ、依存関係は今このようになっています。

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

  • 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/datas.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の場合)

1220
moritz

TLDR

つかいます

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

説明

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

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

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

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

rake db:resetdb:dropおよびdb: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
21
sudo bangbang

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

2
Simon Bagreev

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

これはあなたの質問に答えないかもしれませんが、先に行くことへの洞察をあなたに与えるかもしれません、そして特にレーキファイルとタスクに関してソースを調べることができます。彼らはあなたがRailsを使うのを助けるというかなり良い仕事をするので彼らはいつもそれほどうまくコードを文書化しない。それが何をすべきかを知っていれば、私たち全員がそこで手助けをすることができます。

0