Ruby on Railsデータベースをパージまたは再作成する


582

データでいっぱいの開発Ruby on Railsデータベースがあります。すべて削除してデータベースを再構築したい。私は次のようなものを使うことを考えています:

rake db:recreate

これは可能ですか?


私は最高に賛成された答えを見過ごすことをお勧めします。私の意見でrake db:drop db:create db:schema:loadrake db:drop db:create db:migrate(私はそれについて間違っている準備ができていますが)よりも適切かもしれません。
Jason Swett


2
rake db:drop db:create db:migrate
ウィリアムハンプシャー

db:drop + db:create + db:migrate == db:migrate:resetdb:schema:loadマイグレーションが失敗したとき、私は通常に頼ります。データベースを再作成する必要はほとんどないので、速度はそれほど重要ではありません。また、あなたが未適用の移行を持ち、場合db:schema:loadおよびdb:resetそれらを適用しません。それが多くの議論であるかどうかわかりません。
x-yuri

回答:


1074

私はこれを行う2つの方法を知っています。

これによりデータベースがリセットされ、現在のスキーマが次のすべてでリロードされます。

rake db:reset db:migrate

これにより、dbが破棄されて作成され、現在のスキーマが移行されます。

rake db:drop db:create db:migrate

両方のシナリオですべてのデータが失われます。


36
rake db:reset(少なくともRails 3では)すべての移行も実行しているようですので、これで十分です。
plindberg

1
または、むしろ、すべての移行を実行する場合と同じスキーマを残します。ただし、移行自体は実行されません(したがって、データを挿入する移行がある場合、これは発生しません。このため、実際にはdb / seeds.rbファイルを使用する必要があります)。
plindberg、2011年

1
Tracks GTDアプリではdb:migrateが機能しなかったことを知っています。Sqlite3からPostgresに移動するときは、db:resetを実行する必要がありました。
ラビリンス

11
また、実行する必要がありますrake db:test:prepareテストのために、または他の次のようなエラーが発生します:Could not find table 'things' (ActiveRecord::StatementInvalid)
s2t2

31
誰かがそれを明確にしてrake db:resetrake db:drop db:create db:migrate 2つのまったく異なることをする必要があります。後者は、アプリデータベース全体を一掃し、再作成してから、すべての移行を実行してスキーマ(db/schema.rbまたはdb/structure.sql)を更新しますが、シードデータを入力しません。1つ目はのエイリアスでありrake db:drop db:schema:load db:seed、アプリデータベース全体を消去しますが、スキーマは更新せず、シードデータを入力します。したがって、移行で何も変更していない場合、最初の方が早く、後者の方が安全です。
Claudio Floreani、2015

157

Rails 4では、必要なのは

$ rake db:schema:load

これにより、すべての移行を1つずつ適用する必要なく、DBのコンテンツ全体が削除され、schema.rbファイルからスキーマが再作成されます。


6
レール3でも機能します。あなたは自分のテスト・データベースを台無しにし、あなたのdevのデシベルと一致する作業バージョンにリセットしたいときに便利
bigpotato

これをありがとう。私はそれに気づかずdb:dropdb:create冗長でした。
Grant Birchmeier、2014

3
これはスキーマを更新せず、移行をリファクタリングする場合の安全な方法ではありません。
Claudio Floreani、2015

これが私にとって最良の答えです。
roxdurazo 2016

2
@ClaudioFloreani移行のリファクタリングで問題が発生しています。実行された後は、永久に放っておく必要があります。
nrowegt 2016年

45

ターミナルでは以下のワンライナーを使用しています。

$ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare

これをシェルエイリアスとして入れて名前を付けました remigrate

これで、Railsタスクを簡単に「チェーン」できるようになりました。

$ rake db:drop db:create db:migrate db:schema:dump db:test:prepare # db:test:prepare no longer available since Rails 4.1.0.rc1+

12
これにより、すべての移行が次々に実行されます。これはスケーラブルではなく、エラーが発生しやすくなります。また、db:migrateはschema.rbを更新するので、schema:dumpは何の役にも立ちません。
coreyward 2010年

では、どのようにしてデータベースを空にするのでしょうか。開発中...それをすべてクリアします。
AnApprentice 2010年

3
@AnApprentice実行できますdb:reset。これは、Google(またはガイドを確認)で実行できます。私のコメントは、それを使用しないようにアドバイスすることではなく、db:migrate本当に必要なときに使用しないようにすることですdb:schema:load
coreyward

7
ちなみに、@ TKでは、最後の終了ステータスに応じて、これらすべてを個別のプロセスとして実行する必要はありません。代わりにrake、次のように、必要なすべてのタスクをに渡しますrake db:drop db:create db:schema:load
coreyward

1
逸話ですが、実行db:migrate中に問題が発生したことは一度もありません...一方db:schema:loadで、新しい移行とともにschema.rbをバージョン管理にチェックインし忘れていることに敏感です。
johncip 16

37

更新:Rails 5では、このコマンドは次のコマンドからアクセスできます。

rails db:purge db:create db:migrate RAILS_ENV=test


最新のrails 4.2リリース以降、次のように実行できます。

rake db:purge 

ソース:コミット

# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
  task :purge => [:load_config] do
    ActiveRecord::Tasks::DatabaseTasks.purge_current
  end

上記のように一緒に使用できます:

rake db:purge db:create db:migrate RAILS_ENV=test

@bekicotがわかりやすい英語で言うように、db:purge「すべてのデータを削除し、すべてのテーブルと列は保持する」
MCB

@MCB間違っていました。申し訳db:purge ありませんが、テーブルが保持されていません。
Yana Agun Siswanto 2016

29

必要なものに応じて、使用できます…

rake db:create

…からデータベースを最初から構築するconfig/database.yml、または…

rake db:schema:load

schema.rbファイルからデータベースを一から構築します。


1
最初にデータベースを削除する必要があります。または、必要に応じてテーブルを削除することもできます。
coreyward 2010年

5
スキーマの読み込みの場合は+1。移行はめちゃくちゃになることがありますが、スキーマはそのままにしておく必要があります。
ダニー

Rails 3 Wayで、すべてのマイグレーションを実行するのではなく、スキーマをロードする方法を説明しました。彼らの推論が何であったか正確には覚えていませんが、それは理にかなっているようです。最終結果がどちらの方法でも同じである場合、一連の移行を実行するよりも、スキーマからデータベースをロードするだけの方が簡単でエラーが発生しにくいように見えます。
Jason Swett、2012

3
推論は、移行はデータを移行することを目的としており、モデルが変更されるにつれて時間とともにますます脆弱になります。確実に実行できる場合はいつでも、最小限のスコープモデルをマイグレーションにベイクできますが、これは十分にスケーリングされず、アプリケーションが最終ポイントであると認識しているものからデータベースを構築するよりもはるかに効率が悪いです。 。ブループリント自体から構築できるのに、移行に依存してスキーマのようなデータベースを作成するのはなぜですか?
coreyward 2012

13

コマンドラインから

rake db:migrate:reset

これは、アプリにすべての移行を再度実行させる唯一の方法です。各移行は変更になるためschema.rbとあれば、あなたの唯一dropおよびcreatemigrate(6レール上でテスト)何もしません
シャンプー

12

のように使う

rake db:drop db:create db:migrate db:seed

すべて1行で。環境が何度もリロードされないため、これはより高速です。

db:dropデータベースを削除します。

db:create-データベースを作成します(host / db / passwordはconfig / database.ymlから取得されます)

db:migrate-ディレクトリ(db / migration / migrate- .rb)*ます。

db:seed-ディレクトリ(db / migration / seed.rb)から可能なシードデータを実行しますます。

私は通常好む:

rake db:reset

一度にすべてを行う。

乾杯!


1
私はこれにdb:test:prepareを追加することをお勧めします。もちろん、これはテストするかどうかによって異なります。
2015

db:reset == db:drop + db:schema:load + db:seeddb:migrate:reset == db:drop + db:create + db:migrate
x-yuri

11

一連の手順を実行するだけです。データベースを削除してから再作成し、データを移行します。シードがある場合は、データベースに播種します。

rake db:drop db:create db:migrate db:seed

のデフォルト環境rakedevelopmentであるため、仕様テストで例外が発生した場合は、次のようにテスト環境用のdbを再作成する必要があります。

RAILS_ENV=test rake db:drop db:create db:migrate

ほとんどの場合、テストデータベースはテスト手順の間にシードされるため、db:seedタスクアクションを渡す必要はありません。それ以外の場合は、データベースを準備する必要があります。

rake db:test:prepare

または

RAILS_ENV=test rake db:seed

さらに、再作成タスクを使用するには、次のコードをRakefileに追加できます。

namespace :db do
   task :recreate => [ :drop, :create, :migrate ] do
      if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
         Rake::Task[ 'db:seed' ].invoke
      end
   end
end

次に発行:

rake db:recreate

8

あなたは手動で行うことができます:

rake db:drop
rake db:create
rake db:migrate

またはrake db:reset上記の手順を実行しますが、db/seeds.rbファイル。

追加のニュアンスは、すべてのマイグレーションファイルを再度実行するのではなくrake db:resetschema.rbファイルから直接ロードすることです。

あなたのデータはすべての場合に吹き飛ばされます。


6

次のコマンドラインを使用できます。

rake db:drop db:create db:migrate db:seed db:test:clone

4

特定のデータベースを削除するには、これをRailsコンソールで実行できます。

$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit

次に、DBを再度移行します

$bundle exec rake db:migrate 

4

Rails 4.2では、すべてのデータを削除するがデータベースは保持する

$ bin/rake db:purge && bin/rake db:schema:load

https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md


まあ...試してみましたが、テーブルと列は保持されません。db:purgeを実行した後、db:migrateを実行する必要があります。したがって、これはテーブルと列を保持しません。ただし、データベース自体は保持されるため、db:createの必要はありません。
Freddo

1
@Cedricそうです、db:purgeはテーブルを保持しません。コードを更新しました。
Yana Agun Siswanto

3

db:reset-を使用 して、db:dropおよびdb:setupを実行するか、 db:migrate:resetを実行する -db:drop、db:create、db:migrate。

存在するschema.rbを使用したい場合に依存


2

Railsガイドによると、この1つのライナーはschema.rb、マイグレーションファイルを1つずつリロードするのではなく、からロードするため、使用する必要があります。

rake db:reset

1

開発中は常にデータベースを再作成する必要があるため、そのようにlib / tasksフォルダーにrakeタスクを定義できます。

  namespace :db do
      task :all => [:environment, :drop, :create, :migrate] do
   end 
end

ターミナルで実行します

rake db:all

データベースを再構築します


1

このコマンドを実行する最良の方法は次のとおりです。

**rake db:reset** it does db:drop, db:setup
 rake db:setup does db:create, db:schema:load, db:seed

1

単にあなたは走ることができます

rake db:setup

データを含むシードファイルを作成した場合は、データベースを削除し、新しいデータベースを作成して、シードからdbを生成します。


1

3つのオプション、同じ結果:

1.すべてのステップ:

  $ rake db:drop           # deletes the database for the current env
  $ rake db:create         # creates the database for the current env
  $ rake db:schema:load    # loads the schema already generated from schema.rb / erases data
  $ rake db:seed           # seed with initial data

2.リセット:

  $ rake db:reset          # drop / schema:load / seed

3.移行:リセット:

  $ rake db:migrate:reset  # drop / create / migrate
  $ rake db:seed

ノート:

  • schema:loadを使用すると、すべての移行を実行するよりも高速ですが、同じ結果になります。
  • すべてのデータが失われます。
  • 1行で複数のレーキを実行できます。
  • レールに対応3。

0

今日、railsスキーマにかなりの変更を加えました。階層にさらに2つのモデルが必要であり、他のいくつかを削除する必要があることに気付きました。モデルとコントローラーに必要な多くの小さな変更がありました。

私は2つの新しいモデルを追加し、以下を使用してそれらを作成しました。

rake db:migrate

次に、schema.rbファイルを編集しました。不要になった古いモデルを手動で削除し、外部キーフィールドを必要に応じて変更し、わかりやすくするために少し並べ替えました。すべての移行を削除してから、ビルドを再実行しました。

rake db:reset

それは完全に機能しました。もちろん、すべてのデータをリロードする必要があります。Railsは移行が削除されたことを認識し、最高水準点をリセットしました:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.