ChatGPT解决这个技术问题 Extra ChatGPT

Show pending migrations in rails

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


M
Malik Shahzad

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.


I'm getting Don't know how to build task 'db:migrate:status' on rails 3.2.8
@PeterEhrlich: Does it not show up in rake -T but the other ones do?
bundle exec rake db:migrate:status
How do you read the output of this command? If the status of a row is "down", does that mean it's a pending migration?
up means the migration has been run. down means the migration has not been run.
t
theIV

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.

I love adding this to orchestrate dependencies between rails containers
Still there in Rails 4.1.16
Works in rails 5.1.3 as well
D
Deepak Mahakale

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

g
gerryster

rake db:version will accomplish this on Rails 2.


Also valid in rails 3.2.18
S
Sairam

This works for rails 5.2

ActiveRecord::Base.connection.migration_context.needs_migration?

F
Foram

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


n
niborg

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."

J
John Lockwood

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.


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
w
wondersz1

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
p
puneet18

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.