I'm trying to run just one migration out of a whole bunch in my rails app. How can I do this? I don't want to run any of the migrations before or after it. Thanks.
11 Answers
I've had to run a single migration that changed and needed to be re-run independently of all other migrations. Fire up the console and do this:
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
More usefully this could be put into a rake task etc.
Expanding on the answer by korch above, require
did not work for me, but load
did. To be concrete, for the migration file:
class ChangeMinQuantityToRaces < ActiveRecord::Migration
def change
change_column :races, :min_quantity, :integer, :default => 0
end
end
in the console typing
> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
> ChangeMinQuantityToRaces.new.change
worked for me.
> Race.new.min_quantity # => 0
This was for ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux] and Rails 3.2.13.
Adding my 2¢ to this because I ran into this same issue:
If you absolutely want to run a migration over again without creating a new one, you can do the following:
rails dbconsole -p
devdb=# delete from public.schema_migrations where version = '20150105181157';
And rails will "forget" that it ran the migration for 20150105181157. Now when you run db:migrate it will run it again.
This is almost always a bad idea though. The one instance where it could make sense is if you have a development branch and you haven't fleshed out your migration yet and want to add some things to it in development. But even then it's better to make your migration 2-way so you can properly rollback and retry repeatedly.
There's got to be a way to run the migration class via the console. I can't seem to get the migrations code to be recognizable.
However, as the comments indicate, it's preferred to run the migrations in order. Use:
rake db:migrate VERSION=##########
Copy and paste your code in the migration to script/console?
I have a utility method that makes this very easy in development. I find that it helps me avoid creating too many migrations--normally I modify migrations until they have been deployed.
http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/
I use this technique in development when I change a migration a significant amount, and I don't want to migrate down a ton and lose any data in those along the way (especially when I'm importing legacy data that takes a long time that I don't want to have to re-import again).
This is 100% hackish and I would definitely not recommend doing this in production, but it will do the trick:
- Move migration that you want to re-run out of its directory to a temporary place
- Generate another migration with the same name
- Copy/paste the original migration code into the newly generated migration file
- Run the new migration
- Delete the newly generated migration file
- Edit your schema migrations to remove the most recent value
- Restore the old migration file
STEP=n
argument todb:migrate
(wheren
is the number of migrations to run, just like there is fordb:rollback
) - then you could dorake db:migrate STEP=1
orrake db:migrate STEP=2
, etc. – user664833