Afficher les migrations en attente dans les rails


Réponses:


258

rake db:migrate:status(Rails 3 à 5) ou rails db:migrate:status(Rails 5) y parviendra. Voir ce commit .

upsignifie que la migration a été exécutée. downsignifie que la migration n'a pas été exécutée.


Je monte Don't know how to build task 'db:migrate:status'sur les rails 3.2.8
— Peter Ehrlich

1
@PeterEhrlich: Cela n'apparaît pas rake -Tmais les autres le font?
— jrdioko

2
bundle exec rake db: migrate: status
— Nadeem Yasin

2
Comment lisez-vous la sortie de cette commande? Si l'état d'une ligne est "down", cela signifie-t-il qu'il s'agit d'une migration en attente?
— Dennis

12
upsignifie que la migration a été exécutée. downsignifie que la migration n'a pas été exécutée.
— Josh

37

Il y a rake db:abort_if_pending_migrations(au moins dans Rails 2.3.3, je ne sais pas quand il a été introduit). La description dit «Génère une erreur s'il y a des migrations en attente». Cela semble être davantage utilisé comme prérequis pour d'autres tâches, mais je suppose que vous pourriez l'utiliser à vos fins.

EDIT: Voici un exemple de la sortie après avoir juste généré et non exécuté une migration 'test'

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.

J'adore ajouter ceci pour orchestrer les dépendances entre les conteneurs de rails
— Vincent De Smet

Toujours là dans Rails 4.1.16
— Magne

Fonctionne également dans les rails 5.1.3
— Wilson Silva

16

Cette commande listera toutes les migrations avec leur statut ( UPou DOWN)

Rails 3 et 4

rake db:migrate:status

Rails 5

rake db:migrate:status

# Or

rails db:migrate:status


6

Cela fonctionne pour les rails 5.2

ActiveRecord::Base.connection.migration_context.needs_migration?

2

Essayez rake -h (aide) et jetez un œil à rake -n (= rake --dry-run). Donc, probablement quelque chose comme rake -n db: migrate devrait vous apporter ce que vous voulez.


2
Cela ne fonctionnera pas. Il imprime simplement: ** Invoke db: migrate (first_time) ** Invoke environment (first_time) ** Execute (dry run) environment ** Execute (dry run) db: migrate
— jrdioko

2

Ce n'est peut-être pas tout à fait ce que OP demande, mais si vous avez juste besoin de vérifier rapidement si des migrations sont en attente pour une utilisation dans une tâche rake, sans recourir à

rake db: migrer: état | grep down (peut ne pas fonctionner si vous êtes sous Windows)

ActiveRecord :: Migration.check_pending! (déclenche ActiveRecord :: PendingMigrationError que vous devez récupérer)

vous pouvez utiliser needs_migration? méthode: https://apidock.com/rails/v4.0.2/ActiveRecord/Migrator/needs_migration%3F/class


2
ActiveRecord::Migrator.needs_migration?dans Rails 5.1
— niborg

1

Commande suivante pour vérifier l'état de la migration:

rake db:migrate:status

OU

lorsque vous exécutez votre serveur, il affichera un message pour exécuter d'abord votre migration en attente.



1

Si vous avez besoin d'un bash one-liner pour déterminer s'il faut exécuter une migration ou non (par exemple, migrer uniquement dans une commande de phase de publication Heroku lorsqu'il y a une migration en attente), cela fonctionne:

(rails db:migrate:status | grep "^\s*down") && rails db:migrate || echo "No pending migrations found."
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.