Rails 3で移行ファイルを削除する方法


109

移行ファイルを削除/削除したいのですが。どうすればいいですか?私はここに同様の質問があることを知っていますが、更新として、スクリプト/破棄を行うよりも良い方法はありますか?

また、私がやるべきdb:resetか、db:drop私は削除する場合は/移行を削除しますか?

回答:


142

私は通常:

  1. 実行する rake db:migrate VERSION=XXX私は削除する1前のバージョンに、すべての環境で。
  2. 移行ファイルを手動で削除します。
  3. 保留中の移行がある場合(つまり、削除した移行が最後の移行ではなかった場合)は、rake db:migrateもう一度新しい移行を実行します。

アプリケーションがすでに本番環境またはステージング環境にある場合は、テーブルまたは列を破壊する別の移行を作成する方が安全です。

移行に関するもう1つの優れたリファレンスは次のとおりです。http//guides.rubyonrails.org/migrations.html


2
マイグレーションを削除してからdb:migrateを実行すると、作成されたテーブルが消去されますか?
alvincrespo

2
いいえ、Railsはそれを削除する方法を知りません。self.downデータベースを「ダウングレード」するには、移行で定義されたメソッドを呼び出す必要があります。
ファビオバティスタ

35
すでにファイルを削除している場合は、レールを簡単に解除できないためrake db:migrate:status、欠落しているファイルのIDが表示されます。これを使用して、ファイルを再作成できます。それが戻ったら、この回答のアドバイスに従って勝利することができます。
ジョーダンフェルドスタイン

1
@JordanFeldstein、ありがとう。db:migrate:status命の恩人です!
ディー

1
@Lucas、移行ファイルを削除すると、元に戻すことはできなくなります。そのため、ファイルを削除する前に、すでに実行されているすべての環境(運用、開発、テスト、ステージングなど)で元に戻す必要があります。それがまた、私が書いた理由は、もう1つのマイグレーションを作成して、それを本番環境で実行した後は、古いマイグレーションを元に戻す方が安全だということです。
ファビオ・バティスタ

68

移行を削除する別の方法:

$ rails d migration SameMigrationNameAsUsedToGenerate

rake db:migrateデータベースの変更は永久に残るので、実行前にそれを使用します:)-または手動で変更を削除します


3
「アプリケーションがすでに本番環境またはステージング環境にある場合は、テーブルまたは列を破壊する別の移行を作成する方が安全です。」したがって、変更がデータベースに永久に残ることはありません
JohnMerlino 2013年

8
ちなみに、「d」は「destroy」の略です。
グレッグM.クルサック2014

21

アプリのホームディレクトリから以下のコマンドを実行します。

  1. rake db:migrate:down VERSION="20140311142212" (ここでのバージョンは、移行が作成されたときにrailsが前に付加されたタイムスタンプです。このアクションは、この移行によるDBの変更を元に戻します)

  2. Run "rails destroy migration migration_name"(migration_nameは、マイグレーションの作成時に選択した使用法です。マイグレーションファイル名から「timestamp_」を削除して取得してください)


rake destroy migration AddFileToTable rakeが中止されました!タスク 'destroy'のビルド方法がわからない(--traceを指定してタスクを実行すると、完全なトレースが表示されます)
sadaf2605

3
#2の正しいコマンドは次のとおりです。rails d migration migration_name
mauriciomdea

1
私が必要とする「remove timestamp_」のヒントをありがとう
LightMan


9

使用できます

$ rails d migration table_name  

マイグレーションを削除します。


1
table_nameではなくモデル名にすべきだと思います
Ajeet Khan

3

ときどき、移行ファイルを削除してから、テーブルschema_migrationsの対応するエントリをデータベースから削除しました。きれいではありませんが、うまくいきます。


3

これはRails 5でも機能します。

マイグレーションが最新のマイグレーションであった場合は、マイグレーションによって追加されたデータベース列を削除できます。

rake db:rollback

次に、次のコマンドを実行して、移行ファイル自体を削除します。

rails d migration WhateverYourMigrationWasNamed.rb 


1

削除したい移行が欠落していたため、これらの答えのどれもが私が抱えていた問題に完全に適合していません。他のブランチで移行を作成して実行し、その後破棄しました。問題は、移行が実行されると、Railsがバージョンをschema_migrationsデータベースのテーブルに追加することです。そのため、db構造またはスキーマにリストされていなくても、railsはそれを探します。これらの孤立した移行を実行するには、次のコマンドを実行します。

rails db:migrate:status

欠落しているマイグレーションのバージョンをメモし、dbコンソールに移動します。

rails dbconsole

次に、移行テーブルから手動でバージョンを削除します。

delete from schema_migrations where version='<version>';

あなたは今良いはずです。


0

私はこれと同じ問題を抱えていました:

  1. Rails D Migration Fuu により、最後のタイムスタンプを持つ移行が削除されました
  2. rails d migration fuu-これ により他の移行が削除されました
  3. git statusを使用して、追跡されていないファイルにないことを確認します
  4. Rails G Migration Fuu

それで解決しました


0

サイドノート:レール5.0.0以降 rakeは、rails ため、以下を実行します

rails db:migrate VERSION = 0

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