Comment ignorer l'échec de la migration? (rake db:migrate)
Je n'arrive pas à trouver une option ou quelque chose qui me permet de sauter des migrations.
Je sais ce que vous pensez: "vous ne devriez jamais avoir à le faire..."
J'ai besoin de sauter une migration qui apporte des modifications à l'utilisateur spécifique des documents qui n'existent pas dans ma base de données de développement. Je ne veux pas changer parce que la migration n'est pas une partie de la source, je suis censé travailler avec. Est-il un moyen de passer une migration ou d'ignorer l'échec de la migration?
Merci d'avance!
Vous devez vous connecter pour publier un commentaire.
Je pense que vous devriez résoudre la délinquance des migrations moins fragile, je pense qu'un couple de
if
états et peut-être unrescue
serait suffisant.Mais, si la fixation de la migration n'est pas vraiment une option, vous pouvez faire semblant de diverses manières. Tout d'abord, vous pouvez simplement commenter les méthodes de migration, exécutez
rake db:migrate
, puis décommenter (ou rétablir) la délinquance de la migration.Vous pouvez également faux à l'intérieur de la base de données, mais cette sorte de chicane n'est pas recommandé, sauf si vous savez ce que vous faites et que vous n'avez pas l'esprit manuellement les correctifs des choses quand vous (inévitablement) faire une erreur. Il y a une table dans votre base de données appelée
schema_migrations
qui a un seulvarchar(255)
colonne appeléeversion
; ce tableau est utilisé pardb:migrate
pour suivre les migrations ont été appliquées. Tout ce que vous devez faire est d'INSÉRER leversion
valeur etrake db:migrate
pense que la migration a été fait. Trouver le fautif fichier de migration:ensuite, allez dans votre base de données et de dire:
où
99999999999999
est, bien sûr, le nombre de la migration du nom de fichier. Puis en exécutantrake db:migrate
doit ignorer que la migration.J'irais avec la deuxième option avant le troisième, je suis le seul dont le "hack
schema_versions
" option pour l'exhaustivité.J'ai eu un problème où j'ai eu une migration pour ajouter une table qui existe déjà, donc dans mon cas j'ai dû sauter cette migration en tant que bien, parce que j'ai été l'obtention de l'erreur
J'ai simplement commenté le contenu de la table de la méthode, a couru la migration, puis retirée de la sortir. C'est une sorte de manuel de la façon de la contourner, mais il a travaillé. Voir ci-dessous:
C'est une bonne façon de le faire pour désactiver les erreurs.
db:migrate:up VERSION=my_version
Cela permettra d'exécuter une fonction spécifique à la migration de la "place" des actions. (Il y a aussi le contraire si vous en avez besoin, il suffit de remplacer "jusqu'à" avec "down".) Ainsi, de cette façon, vous pouvez soit exécuter l'avenir de la migration qui fait la plus ancienne (que vous devez ignorer) de travail, ou tout simplement courir chaque migration à l'avance de manière sélective.
Je crois aussi qu'on peut refaire les migrations de cette façon:
rake db:migrate:redo VERSION=my_version
Je n'ai pas essayé cette méthode personnellement, YMMV.
Si vous devez le faire, de votre application migrations sont foiré!
Insère toutes les migrations:
schema_migrations
table je le deviner?schema_migrations
table est simplement une table dans la base de données. Re-lecture de ton titre, je peux voir une autre interprétation. J'ai d'abord lu comme, "Vous n'avez pas à écrire votre migrations correctement." Ce que je pense que vous avez réellement dire, c'est que "Il y a un problème avec les migrations." Mais c'est évident, d'où la question, donc j'ai supposé que le "vous foutu" sens. Mon mauvais.Au lieu de sauter de la migration, vous pourriez faire votre migration intelligente, l'ajout de certains SI elle, de sorte que vous pouvez cocher la case "les utilisateurs spécifiques"
parfois, il est nécessaire de re-remplir
schema_migrations
table avec certainement de corriger les migrations...UNIQUEMENT POUR CE BUT j'ai créé cette méthode
vous pouvez copier-coller dans n'importe quel modèle que vous désirez et l'utiliser à partir de la console
(ou quelque chose d'autre),
où
"xxxxxxxxxxxxxx"
- est horodatage de la migration avant de qui vous voulez arrêter d'insertion (vous pouvez le laisser vide)!!! ne l'utilisez que si vous devez absolument comprendre quel est le résultat que vous obtenez !!!
De passer tous en attendant les migrations, exécutez ceci dans votre terminal:
(Pour macOS utilisation pbcopy au lieu de xclip)
Puis CTRL-V le résultat à l'intérieur des rails de la console:
Et appuyez sur ENTRÉE.
Vous pouvez modifier la liste des migrations que vous voulez passer en les retirant de la matrice un avant l'exécution de la ligne.