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?

alvincrespo
la source

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

Fábio Batista
la source
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

Gediminas
la source
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)

Renard
la source
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.

Vicky
la source
9

On peut utiliser,

$ rails d migration table_name  

Ce qui supprimera la migration.

Agnès
la source
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.

frenesim
la source
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 
random_user_0891
la source
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.

pilePoussoir
la source
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

Miguel Alatorre
la source
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

Mohamed Daw
la source