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
を行います)、新しいデータベースでマイグレーションを実行します。私の理解が間違っていたら、明確にするのを手伝ってください。
db:schema:load schema.rbに従って、(既存の)データベース内にテーブルと列を作成します。
db:setup db:create、db:schema:load、db:seedを行います。
通常は、新しい移行ファイルを使用してスキーマに変更を加えた後にdb:migrateを使用します(これはデータベースにデータがすでに存在する場合にのみ意味があります)。 db:schema:loadは、アプリの新しいインスタンスを設定するときに使用されます。
それが役立つことを願っています。
Rails 3.2.12用のアップデート:
私はソースをチェックしたところ、依存関係は今このようになっています。
db:schema:dump 現在の環境変数のスキーマをダンプします(そして同様にdbも作成します)
db:setup db:schema:load、db:seedを実行します。
詳しくは 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の場合)
つかいます
rake db:migrate
スキーマに変更を加えたい場合rake db:reset
データベースを削除する場合は、schema.rb
からスキーマを再ロードし、データベースを再シードしますrake db:schema:load
schema.rb
で提供されているスキーマにデータベースをリセットする場合(これによりすべてのデータが削除されます)rake db:schema:load
は、schema.rb
ファイルで提供されるスキーマを設定します。これはdb:migrate
ほど時間がかからないため、アプリの新規インストールに役立ちます
重要な注意、
db:schema:load
はサーバー上のデータをdeleteします。
rake db:migrate
は、既存のスキーマに変更を加えます。スキーマのバージョンを作成するようなものです。 db:migrate
はdb/migrate/
でRubyファイルを探し、最も古いものから開始してまだ実行されていない移行を実行します。 Railsは、移行ファイル名の先頭のタイムスタンプを調べることで、最も古いファイルを認識します。 db:migrate
には、データをデータベースに入れることもできるという利点があります。これは実際には良い習慣ではありません。 rake db:seed
を使用してデータを追加することをお勧めします。
rake db:migrate
は、タスク p 、 down などを提供し、rake db:rollback
などのコマンドを有効にして、最も便利なコマンドにします。
rake db:reset
はdb:drop
およびdb:setup
を実行します
データベースを削除し、再度作成し、スキーマをロードし、シードデータで初期化します
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.rb
ファイルに基づいてデータベースを再作成します。そのため、schema.rb
ファイルが常に最新でバージョン管理されていることを確認する必要があります。
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を使うのを助けるというかなり良い仕事をするので彼らはいつもそれほどうまくコードを文書化しない。それが何をすべきかを知っていれば、私たち全員がそこで手助けをすることができます。