web-dev-qa-db-ja.com

Rake db:migrate-すべての移行を取り消してやり直す方法

すべての移行のための簡単なrake db:rollbackコマンドはありますか?

42

すべての移行をロールバックする

すべての移行をロールバックするための最良の解決策は、@ Claudio Floreaniが提案したものです。

rake db:migrate VERSION=0

これにより、データを失うことなく移行がロールバックされます。次に、すべての移行を再度実行します

rake db:migrate

データベースのリセット(これによりすべてのデータが削除されます)

以下に説明する両方の方法はデータベースを削除し、データベース内のすべてのデータを失うため、何をしているのかが確かな場合にのみ使用してください。

リセットする

rake db:migrate:reset #runs db:drop db:create db:migrate

このメソッドはデータベースを削除し、移行を再度実行します。

最後のスキーマの読み込み

rake db:reset

このメソッドは、データベースを削除し、最後のスキーマからデータをロードします。

この投稿で詳細を見ることができます: rake db:migrate db:resetとdb:schema:loadの違い

@Claudio Floreaniと、回答を改善するためにコメントしてくれたすべてのユーザーに感謝します。

132
Alex Falke

本当にすべての移行をロールバックするで、データベースを元の状態または最後のスキーマにするだけではない場合は、次を実行する必要があります。

rake db:migrate VERSION=0

これにより、実際にすべての移行が完全にロールバックされ、すべての移行が可逆的になります。

今発行する場合

rake db:migrate:status

すべての移行がまだ存在しているが、「ダウン」(適用されていない)状態にあることがわかります。

rake db:resetまたはrake db:drop(@Orlandoまたは@Alex Falkeによる回答など)を暗示する他のコマンドは、ロールバックをまったく行いません。つまり、すべての移行が保証されるわけではありません。リバーシブルです。

さらに、他のユーザーがデータベースにアクセスしている間はrake db:dropを実行できませんが、ロールバックはライブで実行できます(これは一般的に推奨されていませんが)。最後に重要なことですが、単にデータベースを削除して再作成すると、スキーマ移行テーブルも削除されます。データベースの削除後に誰かがrake db:migrate:statusを実行すると、「スキーマ移行テーブルはまだ存在しません」どの移行を適用できるかについての手がかりはありません(彼がまだ知っているか、リストすることができる場合を除く)。

25

単にrake db:reset、データベースを削除し(すべての移行を元に戻すのと同じ)、最後のスキーマにリセットします。

[〜#〜] update [〜#〜]:より正確なアプローチはrake db:migrate:reset。これにより、データベースが削除され、再度作成され、最新のスキーマにリセットされるのではなく、すべての移行が実行されます。

13
Orlando

許可の問題が発生した場合(私に起こったように)、多分、rubymineで行ったようにすべてのデータベーステーブルをドロップしてみてください(データベースツールウィンドウを開いて、すべてのテーブルを選択し、右クリック->ドロップ)。他のIDE。 sqlite_masterやsqlite_sequenceなどの一部のテーブルは、ドロップで便利に無視されました。

これにより

Rails db:migrate

そしてすべてがうまくいきました。もちろん、すべてのデータを失います!

0
Loaderon