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.