116

I would like to remove/delete a migration file. How would I go about doing that? I know there are similar questions on here but as an update, is there a better way than doing script/destroy?

Also, should I do a db:reset or db:drop if I remove/delete a migration?

tshepang
  • 12,111
  • 21
  • 91
  • 136
alvincrespo
  • 9,224
  • 13
  • 46
  • 60

11 Answers11

154

I usually:

  1. Perform a rake db:migrate VERSION=XXX on all environments, to the version before the one I want to delete.
  2. Delete the migration file manually.
  3. If there are pending migrations (i.e., the migration I removed was not the last one), I just perform a new rake db:migrate again.

If your application is already on production or staging, it's safer to just write another migration that destroys your table or columns.

Another great reference for migrations is: http://guides.rubyonrails.org/migrations.html

Chris Frederick
  • 5,482
  • 3
  • 36
  • 44
Fábio Batista
  • 25,002
  • 3
  • 56
  • 68
  • 2
    Would deleting the migration and then running a db:migrate wipe out the table that was created? – alvincrespo Oct 07 '10 at 17:35
  • 2
    No, since Rails would not know how to delete it. It needs to call the `self.down` method defined on your migration to "downgrade" your database. – Fábio Batista Oct 07 '10 at 18:10
  • I just edited my response with 2 good references, check that out. – Fábio Batista Oct 07 '10 at 18:29
  • Oh, I see. Ok, thanks, this is exactly what I was wondering about. Thanks Again! – alvincrespo Oct 07 '10 at 21:43
  • 40
    If you've already deleted the file, without realizing rails will not let go that easily, `rake db:migrate:status` will show you the ID of the missing file, which you can use to recreate it. Once it's back, you can follow this answer's advice to victory. – Jordan Warbelow-Feldstein Sep 19 '11 at 00:15
  • It seems that for everyone 1. step is clear, but for me it's not:( What does it mean "...on all environments, to the version before the one I want to delete."? Thanks! – Gediminas Šukys Apr 06 '13 at 21:05
  • 1
    @Lucas, once the migration file is removed, it cannot be reversed anymore. That's why you must revert it on all environments it already ran (production, development, testing, staging, etc) before deleting its file. That's also why I wrote that it's safer to just create another migration to revert that old one, once it's already ran on production. – Fábio Batista Apr 07 '13 at 00:08
86

Another way to delete the migration:

$ rails d migration SameMigrationNameAsUsedToGenerate

Use it before rake db:migrate is executed because changes in database will stay forever :) - or remove changes in Database manually

Gediminas Šukys
  • 7,101
  • 7
  • 46
  • 59
25

Run below commands from app's home directory:

  1. rake db:migrate:down VERSION="20140311142212" (here version is the timestamp prepended by rails when migration was created. This action will revert DB changes due to this migration)

  2. Run "rails destroy migration migration_name" (migration_name is the one use chose while creating migration. Remove "timestamp_" from your migration file name to get it)

Mayur Shah
  • 3,344
  • 1
  • 22
  • 41
fOx
  • 267
  • 3
  • 6
10

We can use,

$ rails d migration table_name  

Which will delete the migration.

Sam
  • 7,252
  • 16
  • 46
  • 65
Agnes
  • 141
  • 2
  • 12
10

You can also run a down migration like so:

rake db:migrate:down VERSION=versionnumber

Refer to the Ruby on Rails guide on migrations for more info.

Dave Powers
  • 2,051
  • 2
  • 30
  • 34
Vicky
  • 419
  • 5
  • 10
10

None of these answers quite fit the problem i had as the migration i wanted to delete was missing: I had created and run a migration in some other branch, which was then discarded. The problem is when a migration is run, rails adds the version into a schema_migrations table in the database. So even if it isn't listed in your db structure or schema, rails looks for it. You can reveal these orphaned migrations by running:

rails db:migrate:status

Note the versions of the missing migrations and head into the db console:

rails dbconsole

Now remove the versions from the migration table manually:

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

You should now be good.

stackPusher
  • 6,076
  • 3
  • 35
  • 36
3

Sometimes I found myself deleting the migration file and then deleting the corresponding entry on the table schema_migrations from the database. Not pretty but it works.

frenesim
  • 703
  • 9
  • 10
3

This also works in Rails 5.

If the migration was the most recent one you can remove the database column(s) that the migration added by doing:

rake db:rollback

then remove the migration file itself by running:

rails d migration WhateverYourMigrationWasNamed.rb 
random_user_0891
  • 1,863
  • 3
  • 15
  • 39
1

Look at 4.1 Rolling Back

http://guides.rubyonrails.org/migrations.html

$ rake db:rollback

0

I just had this same problem:

  1. rails d migration fuu -this deleted the migration with the last timestamp
  2. rails d migration fuu -this deleted the other migration
  3. use git status to check that is not on the untracked files anymore
  4. rails g migration fuu

That fixed it for me

0

Side Note: Starting at rails 5.0.0 rake has been changed to rails So perform the following

rails db:migrate VERSION=0

Mohamed Daw
  • 71
  • 1
  • 6