Is there a rake task that shows the pending migrations in a rails app?
rake db:migrate:status
(Rails 3 to 5) or rails db:migrate:status
(Rails 5) will accomplish this. See this commit.
up
means the migration has been run. down
means the migration has not been run.
There is rake db:abort_if_pending_migrations
(at least in Rails 2.3.3, not sure when it was introduced). The description says 'Raises an error if there are pending migrations'. This seems to be used more as a prerequisite for other tasks, but I'm guessing you could use it for your purposes.
EDIT: Here is an example of the output after having just generated and not run a 'test' migration
rails_project theIV$ rake db:abort_if_pending_migrations
(in /Users/theIV/Sites/rails_project/)
You have 1 pending migrations:
20090828200602 Test
Run "rake db:migrate" to update your database then try again.
This command will list all migrations with their status (UP
or DOWN
)
Rails 3 and 4
rake db:migrate:status
Rails 5
rake db:migrate:status
# Or
rails db:migrate:status
rake db:version
will accomplish this on Rails 2.
This works for rails 5.2
ActiveRecord::Base.connection.migration_context.needs_migration?
If you want to see how much migration is done or pending you can see using below command.
rails db:migrate:status
More on this link: Rails Active Record Migration
If you need a bash one-liner to determine whether to run a migration or not (e.g., only migrate in a Heroku release phase command when there is a pending migration), this works:
(rails db:migrate:status | grep "^\s*down") && rails db:migrate || echo "No pending migrations found."
Try rake -h (help) and have a look at rake -n (= rake --dry-run). So probably something like rake -n db:migrate should get you what you want.
Might not quite be what OP is asking for, but if you just need to quickly check if any migrations are pending for use in a rake task, without resorting to
rake db:migrate:status | grep down (might not work if you're on Windows)
ActiveRecord::Migration.check_pending! (raises ActiveRecord::PendingMigrationError that you need to rescue)
you can use needs_migration? method: https://apidock.com/rails/v4.0.2/ActiveRecord/Migrator/needs_migration%3F/class
ActiveRecord::Migrator.needs_migration?
in Rails 5.1
Following command to check migration status:
rake db:migrate:status
OR
when you run your server, it will display a message to run your pending migration first.
Success story sharing
Don't know how to build task 'db:migrate:status'
on rails 3.2.8rake -T
but the other ones do?up
means the migration has been run.down
means the migration has not been run.