191

Is there a rake task that shows the pending migrations in a rails app?

clami219
  • 2,958
  • 1
  • 31
  • 45
readonly
  • 343,444
  • 107
  • 203
  • 205

10 Answers10

308

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.

Malik Shahzad
  • 6,703
  • 3
  • 37
  • 49
jrdioko
  • 32,230
  • 28
  • 81
  • 120
45

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.
theIV
  • 25,434
  • 5
  • 54
  • 58
20

This command will list all migrations with their status (UP or DOWN)

Rails 3 and 4

rake db:migrate:status

Rails 5 and above

rake db:migrate:status

# Or

rails db:migrate:status

This will return something like

database: blog_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210131124730  Create articles
  down    20210131124801  Create users
Deepak Mahakale
  • 22,834
  • 10
  • 68
  • 88
15

rake db:version will accomplish this on Rails 2.

gerryster
  • 650
  • 1
  • 6
  • 11
14

This works for rails 5.2

ActiveRecord::Base.connection.migration_context.needs_migration?
Sairam
  • 2,708
  • 1
  • 25
  • 34
4

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

Foram
  • 483
  • 5
  • 12
3

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."
niborg
  • 390
  • 4
  • 16
2

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.

John Lockwood
  • 3,787
  • 29
  • 27
  • 3
    That won't work. It just prints: ** Invoke db:migrate (first_time) ** Invoke environment (first_time) ** Execute (dry run) environment ** Execute (dry run) db:migrate – jrdioko Jan 24 '11 at 19:25
2

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

wondersz1
  • 757
  • 8
  • 15
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.

puneet18
  • 4,341
  • 2
  • 21
  • 27