web-dev-qa-db-fra.com

Rake db: migrate - comment annuler toutes les migrations et les refaire

Existe-t-il une commande rapide rake db: rollback pour toutes les migrations?

36
Lucy Weatherford

Bien que la réponse de @Orlandos soit correcte, rake db:reset ne refait pas toutes les migrations et, comme il dit, charge les données du dernier schéma . Si vous voulez annuler toutes les migrations puis les refaire, vous devez utiliser:

rake db:migrate:reset #runs db:drop db:create db:migrate

Vous pouvez voir plus d’informations dans cet article: Différence entre rake db: migrate db: reset et db: schema: load

127
Alex Falke

Si vous voulez vraiment annuler toutes les migrations et ne pas simplement amener la base de données à un état vierge ou au dernier schéma, vous devez exécuter:

rake db:migrate VERSION=0

En fait, cela annulera chaque migration et garantira que chaque migration est réversible.

Si vous publiez maintenant

rake db:migrate:status

vous verrez que toutes les migrations sont toujours là mais elles sont dans un état «bas» (non appliqué).

D'autres commandes impliquant un rake db:reset ou un rake db:drop (comme dans les réponses de @Orlando ou @Alex Falke) ne feront aucune restauration, c'est-à-dire qu'elles ne garantiront pas que chaque migration est réversible.

De plus, rake db:drop ne peut pas être exécuté pendant que d'autres utilisateurs accèdent à la base de données, tandis que les restaurations peuvent être effectuées en direct (même si cela n'est généralement pas recommandé). Enfin, supprimer et recréer la base de données supprimera également la table des migrations de schéma: si quelqu'un exécute rake db:migrate:status après que la base de données a été supprimée, il reçoit la réponse suivante: "La table des migrations de schéma n'existe pas encore" et n'a aucun indice. quelles migrations peuvent être appliquées (à moins qu'il ne le sache ou ne puisse les énumérer).

23
Claudio Floreani

il suffit d'utiliser rake db:reset pour supprimer votre base de données (comme pour l'annulation de toutes les migrations) et rétablir le dernier schéma.

UPDATE: une approche plus correcte utilisera rake db:migrate:reset. Cela va supprimer la base de données, la recréer et exécuter toutes les migrations, au lieu de réinitialiser le dernier schéma.

14
Orlando

Si un problème d'autorisation se pose (comme cela m'est arrivé), vous pourriez peut-être essayer de supprimer toutes les tables de la base de données, comme je l'ai fait avec rubymine (ouvrez simplement la fenêtre de l'outil de base de données, sélectionnez toutes les tables et cliquez avec le bouton droit de la souris -> supprimer), il devrait être similaire avec autres IDE. Certaines tables telles que sqlite_master et sqlite_sequence ont été commodément ignorées dans la liste déroulante.

Cela m'a permis de faire 

Rails db:migrate

et tout a bien fonctionné. Bien sûr, vous perdez toutes les données!

0
Loaderon