Ruby on Rails:rake db:migrateを使用して移行を元に戻すにはどうすればよいですか?


94

devise MODEL Userをインストールした後、私はこれを得ました。

class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end

  def self.down
    drop_table :users
  end
end

ここで、rake db:migrateを実行すると、usersテーブルが作成されます。

この移行を元に戻すにはどうすればよいですか。つまり、rakeを使用してusersテーブルを再度削除するにはどうすればよいですか?

回答:


147

次のコマンドを実行します

rake db:migrate:down VERSION=<version>

どこ<version>あなたは戻したいあなたの移行ファイルのバージョン番号です。

例えば。ファイル名3846656238_create_users.rbの移行を元に戻す場合

rake db:migrate:down VERSION = 3846656238


私は取得してUnknownMigrationVersionErrorいますが、それは私の移行がの内部にあるためだとdb/migrate/mainわかりました。誰かがこのdb:migrate:down特定のディレクトリまたは移行サブディレクトリの内部を確認するための回避策を知っていますか?
tf.rz 2016年

これは、レール3以降のみです。私の人生はレール2にあります。とても悲しい
モーフック

@morhookこれはRails 3でも機能します。こちらのガイドを
Mahesh

あなたが正しいです!Rails 2とRails 3の両方で機能します。入力をありがとう@Mahesh!
モーフック


65

移行を元に戻すには3つのオプションがあると思います(これらも重複しています)。

  1. 最新の移行をロールダウンします。

    rake db:migrate:down #Rails 2のみ。

  2. 最近のマイグレーションの数(n)をロールダウンします。

    rake db:rollback STEP=n

  3. 以前の特定のバージョンにロールダウンます。

    $ rake db:migrate:down VERSION=nnn #Rails 3(バージョン番号も提供)。

バージョン番号は、コミットのSHA(Secure Hash Algorithm)を意味します。これは、886af3194768917c78eのような長い16進数です...次のようにして確認できます git log

これらのコマンド(および他のコマンド)とその説明rake -T db:は、rails 3.2のwhichに含まれる以下を使用して確認できます。

rake db:migrate         # Migrate the database (options: VERSION=x, VERBOSE=false)
rake db:migrate:status  # Display status of migrations
rake db:rollback        # Rolls the schema back to the previous version (specify steps w/ STEP=n)

5
ロールダウン:特定のバージョンrake db:migrate VERSION=<version number>
Ajedi32

3
少なくともレール3.0.20では、最初のコマンドは間違っています。rake db:migrate:downエラーメッセージ「VERSIONが必要です」で単一のアボートが中止されます。ただし、推奨 rake db:rollbackは機能します。
マーティン2013年

回答で詳しく説明されているように、Rails 2は最初のコマンドのみです。
Michael Durrant 2014

1
環境変数では大文字と小文字が区別されるため、大文字と小文字を区別する必要がSTEPありますVERSION
Kostas Rousis '7/07/14

明確にするため、バージョンに$ rake db:migrate:down VERSION=nnnロールダウンせず指定されバージョンに移行します。
johnml

15

あなたはロールバックを行い、ロールバックされる最後のマイグレーションの数を指定することができます、例えば

rake db:rollback STEP=3

最後の3回の移行。


これは、最後のいくつかの移行を元に戻したい場合にバージョン番号を検索する代わりに、より迅速かつ簡単な方法です
プレアルファ

11

新しいプログラマーとして(または他の新しいプログラマーに対して)

rake db:rollback約半分の時間で動作します。そこから始めます。

そうでない場合、 rake db:migrate:down VERSION=3846656238

元に戻す移行ファイルのバージョン番号にVERSIONを接続します。


10
rake db:migrate:redo

最後の移行を取り消して再適用します。


5

レール5に使用できます rails command instead of rake

rails db:migrate:down VERSION=<version>

rails db:migrate:down VERSION = 20170330090327


2

端末で次のコマンドを実行します。

rake db:migrate:status

または

bundle exec rake db:migrate:status

以前に実行したすべての移行のステータス、移行ID、移行名が表示されます。移行ID(つまり、バージョン番号)を選択し、そのIDを次のコマンドのversion = ,,の後に入力して、Enterキーを押します

bundle exec rake db:migrate:down VERSION=

0

移行をロールバックする方法

(1)最初に移行IDを特定する

rake db:migrate:status

  • ID番号をコピーします。

ロールバックする移行を特定します。

(2)次に移行をロールバックします

rake db:migrate:down VERSION=20190802023239

  • 上記の関連するID番号を貼り付けます。もちろん、あなたの場合、移行IDは異なります!正しい移行IDを使用してください。

.......そして今、あなたはレースに出かけています!

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