Ruby on Rails: How can I revert a migration with rake db:migrate?
Asked Answered
O

9

103

After installing devise MODEL User i got this.

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

Now if i do rake db:migrate the users table will be created.

How can i revert this migration, i.e. how can I delete the users table using rake again ?

Octagonal answered 8/10, 2011 at 2:54 Comment(0)
H
157

Run the following command

rake db:migrate:down VERSION=<version>

where <version> is the version number of your migration file you want to revert.

eg. if you want to revert a migration with file name 3846656238_create_users.rb

rake db:migrate:down VERSION=3846656238

Haifa answered 8/10, 2011 at 6:39 Comment(4)
I'm getting an UnknownMigrationVersionError but I figured out it's because my migrations are inside db/migrate/main , does anybody know a workaround for this to have db:migrate:down look inside that specific directory or the migrate subdirectories?Hairsplitter
This is just for rails 3 onwards. My life is in rails 2. So sadMichellmichella
@Michellmichella This works for rails 3 also. Check the docs here guides.rubyonrails.org/v3.2/migrations.htmlHaifa
You are right! It works for both rails 2 and rails 3. Thanks @Haifa for your input!Michellmichella
F
117

Just run this command:

rake db:rollback
Frere answered 8/10, 2011 at 2:57 Comment(0)
C
68

I believe there are three options available for reverting migrations (they also overlap):

  1. Roll down the most recent migration:

    rake db:migrate:down # Rails 2 only.

  2. Roll down a number(n) of recent migrations:

    rake db:rollback STEP=n

  3. Roll down to a previous, specific version:

    $ rake db:migrate:down VERSION=nnn # Rails 3 (provide version number also).

Version Number means the SHA(Secure Hash Algorithm) for the commit which is a long hexadecimal number which looks something like 886af3194768917c78e... You can see it by doing git log

You can see these commands (and others) with their descriptions by using rake -T db: which for rails 3.2 includes:

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)
Corvette answered 8/10, 2011 at 2:58 Comment(5)
Roll down to a specific version: rake db:migrate VERSION=<version number>Fanchan
At least for rails 3.0.20, the first command is wrong. A single rake db:migrate:down aborts with the error message "VERSION is required". The recommended rake db:rollback however works.Toastmaster
As detailed in the answer, Rails 2 ONLY for the first commmand.Corvette
Environment variables are case sensitive so it should be STEP and VERSIONCadaverous
To clarify, $ rake db:migrate:down VERSION=nnn doesn't roll down to a version, it migrates down the version specified.Coursing
S
16

You can do rollback and specify how many last migrations will be rollbacked, e.g.

rake db:rollback STEP=3

for 3 last migrations.

Selfconsistent answered 8/10, 2011 at 8:27 Comment(1)
this is a more quicker and easier way, instead of looking up version numbers if you want to undo the last few migrationsTamathatamaulipas
R
11

As an new programmer (or to other new programmers)

rake db:rollback works about half the time. I start there.

If not, rake db:migrate:down VERSION=3846656238

plug in VERSION for the version number of your migration file you want to revert.

Radcliff answered 10/2, 2015 at 0:6 Comment(0)
Y
10
rake db:migrate:redo

It will undo and reapply the last migration.

Young answered 6/6, 2014 at 19:38 Comment(0)
A
5

For rails 5 we can use rails command instead of rake

rails db:migrate:down VERSION=<version>

example

rails db:migrate:down VERSION=20170330090327

Authorship answered 31/3, 2017 at 5:55 Comment(0)
N
3

Run this command in your terminal:

rake db:migrate:status

or

bundle exec rake db:migrate:status

It shows the status, migration ID's, migration name for all migration we ran previously. select your migration id (i.e your version number) and put that id in the following command after version= ,,, and press enter

bundle exec rake db:migrate:down VERSION=
Natka answered 9/8, 2016 at 10:39 Comment(0)
C
1

How to Roll back a migration

Another way. I prefer this because you need to be explicit, rather than rolling back - just in case you might make a mistake.

(1) First Identify The Migration ID

rake db:migrate:status

  • Copy the ID number.

Identify the migration to roll back.

(2) Then Roll back the migration

rake db:migrate:down VERSION=20190802023239

  • Paste the relevant ID number above. Of course, in your case, the migration ID will be different!

.......and now you're off to the races!

Castellatus answered 2/8, 2019 at 4:22 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.