Comment supprimer les fichiers de migration dans Rails 3


109

Je souhaite supprimer / supprimer un fichier de migration. Comment pourrais-je faire ça? Je sais qu'il y a des questions similaires ici, mais comme mise à jour, y a-t-il un meilleur moyen que de faire un script / détruire?

Aussi, dois-je faire une db:resetou db:dropsi je supprime / supprime une migration?

Réponses:


142

D'habitude je:

  1. Effectuez un rake db:migrate VERSION=XXXsur tous les environnements, à la version antérieure à celle que je souhaite supprimer.
  2. Supprimez le fichier de migration manuellement.
  3. S'il y a des migrations en attente (c'est-à-dire que la migration que j'ai supprimée n'était pas la dernière), je viens d'effectuer une nouvelle rake db:migratefois.

Si votre application est déjà en production ou en préparation, il est plus sûr d'écrire simplement une autre migration qui détruit votre table ou vos colonnes.

Une autre excellente référence pour les migrations est: http://guides.rubyonrails.org/migrations.html


2
La suppression de la migration, puis l'exécution d'un db: migrate effaceraient-elles la table qui a été créée?
alvincrespo

2
Non, puisque Rails ne saurait pas comment le supprimer. Il doit appeler la self.downméthode définie lors de votre migration pour «rétrograder» votre base de données.
Fábio Batista

35
Si vous avez déjà supprimé le fichier, sans vous rendre compte que les rails ne lâcheront pas aussi facilement, rake db:migrate:statusvous montrera l'ID du fichier manquant, que vous pouvez utiliser pour le recréer. Une fois de retour, vous pouvez suivre les conseils de cette réponse jusqu'à la victoire.
Jordan Feldstein

1
@JordanFeldstein, merci. db:migrate:statusest une bouée de sauvetage!
dee

1
@Lucas, une fois le fichier de migration supprimé, il ne peut plus être annulé. C'est pourquoi vous devez le restaurer sur tous les environnements qu'il a déjà exécutés (production, développement, test, transfert, etc.) avant de supprimer son fichier. C'est aussi pourquoi j'ai écrit qu'il est plus sûr de simplement créer une autre migration pour rétablir l'ancienne, une fois qu'elle est déjà exécutée en production.
Fábio Batista

68

Une autre façon de supprimer la migration:

$ rails d migration SameMigrationNameAsUsedToGenerate

Utilisez-le avant d' rake db:migrateêtre exécuté car les modifications de la base de données resteront pour toujours :) - ou supprimez les modifications manuellement


3
"Si votre application est déjà en production ou en préparation, il est plus sûr d'écrire simplement une autre migration qui détruit votre table ou vos colonnes." Donc, les changements ne restent pas éternellement dans la base de données
JohnMerlino

8
À propos, «d» signifie «détruire».
Greg M. Krsak

21

Exécutez les commandes ci-dessous à partir du répertoire d'accueil de l'application:

  1. rake db:migrate:down VERSION="20140311142212" (ici la version est l'horodatage ajouté par les rails lors de la création de la migration. Cette action annulera les modifications de la base de données en raison de cette migration)

  2. Run "rails destroy migration migration_name"(nom_migration est celui que vous avez choisi lors de la création de la migration. Supprimez " timestamp_ " du nom de votre fichier de migration pour l'obtenir)


rake destroy migration AddFileToTable rake abandonné! Je ne sais pas comment construire la tâche `` détruire '' (voir la trace complète en exécutant la tâche avec --trace)
sadaf2605

3
Pour le n ° 2, la commande correcte est:rails d migration migration_name
mauriciomdea

1
Merci pour l'astuce "remove timestamp_" c'est ce dont j'avais besoin
LightMan

10

Vous pouvez également exécuter une migration vers le bas comme ceci:

rake db:migrate:down VERSION=versionnumber

Reportez-vous au guide Ruby on Rails sur les migrations pour plus d'informations.


9

On peut utiliser,

$ rails d migration table_name  

Ce qui supprimera la migration.


1
Je pense que cela devrait être le nom du modèle plutôt que le nom de la table
Ajeet Khan

3

Parfois, je me suis retrouvé à supprimer le fichier de migration, puis à supprimer l'entrée correspondante sur la table schema_migrations de la base de données. Ce n'est pas beau, mais ça marche.


3

Cela fonctionne également dans Rails 5.

Si la migration était la plus récente, vous pouvez supprimer la ou les colonnes de base de données ajoutées par la migration en procédant comme suit:

rake db:rollback

puis supprimez le fichier de migration lui-même en exécutant:

rails d migration WhateverYourMigrationWasNamed.rb 


1

Aucune de ces réponses ne correspondait tout à fait au problème que j'avais car la migration que je voulais supprimer était manquante: j'avais créé et exécuté une migration dans une autre branche, qui a ensuite été rejetée. Le problème est que lorsqu'une migration est exécutée, rails ajoute la version dans une schema_migrationstable de la base de données. Ainsi, même s'il n'est pas répertorié dans votre structure ou schéma de base de données, rails le recherche. Vous pouvez révéler ces migrations orphelines en exécutant:

rails db:migrate:status

Notez les versions des migrations manquantes et accédez à la console db:

rails dbconsole

Supprimez maintenant les versions de la table de migration manuellement:

delete from schema_migrations where version='<version>';

Vous devriez maintenant être bon.


0

J'ai juste eu ce même problème:

  1. rails d migration fuu - cela a supprimé la migration avec le dernier horodatage
  2. rails d migration fuu - cela a supprimé l'autre migration
  3. utilisez git status pour vérifier que ce n'est plus sur les fichiers non suivis
  4. rails g migration fuu

Cela a réglé ça pour moi


0

Note latérale: À partir de rails 5.0.0 rakea été changé en rails Donc, procédez comme suit

rails db: migrer VERSION = 0

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.