Rails: Est-il mauvais d'avoir un irréversible de la migration?
Quand est-il acceptable de soulever une ActiveRecord::IrreversibleMigration exception dans l'auto.méthode de migration? Quand faut-il prendre l'effort de mise en œuvre de l'inverse de la migration?
Vous devez vous connecter pour publier un commentaire.
Si vous travaillez dans la production de systèmes de alors oui, c'est très mauvais. Si c'est votre propre projet de compagnie, alors tout est permis (si rien d'autre, il sera une expérience d'apprentissage :), même si les chances sont que plus tôt plutôt que plus tard, même dans un projet de compagnie, vous vous surprendrez à avoir mis une croix sur une migration inverse uniquement pour faire annuler la migration, quelques jours plus tard, soit par l'intermédiaire des
rake
ou manuellement).Dans un scénario de production, vous devez toujours faire l'effort d'écrire et test réversible migration dans l'éventualité que vous allez à travers elle dans la production, puis de découvrir un bug qui vous oblige à faire reculer (code et schéma) de la révision précédente (dans l'attente de certains non-trivial fix -- et inutilisable système de production.)
Inverse des migrations de gamme de la plupart trivial (en supprimant des colonnes ou des tableaux qui ont été ajoutés lors de la migration, et/ou en changeant les types de colonnes, etc.) pour un peu plus compliqué (
execute
deJOIN
edINSERT
s ouUPDATE
s), mais rien n'est si complexe que pour justifier "la balayer sous le tapis". Si rien d'autre, se forçant à penser à des façons de parvenir à inverser les migrations peuvent vous donner un aperçu de la très problème que votre migration de fixation.Vous pouvez parfois dans une situation où une avant la migration supprime une fonction, entraînant des données supprimées de la base de données. Pour des raisons évidentes, l'inverse de la migration ne peut pas ressusciter les données rejetées. Bien que l'on puisse, dans de tels cas, vous recommandons d'avoir le avant la migration enregistrer automatiquement les données ou le garder dans l'éventualité de la restauration comme une alternative à l'échec total (enregistrer pour
yml
, copier/déplacer vers une table spéciale, etc.), vous n'avez pas, comme le temps nécessaire pour tester une telle procédure automatisée pourrait dépasser le temps nécessaire pour restaurer les données à la main (au besoin.) Mais même dans ces cas, au lieu de simplement faute de, vous pouvez toujours faire l'inverse de la migration conditionnellement et temporairement échouer l'attente d'une action de l'utilisateur (c'est à dire tester l'existence de certaines tableau qui doit être restauré manuellement; si elle est absente, la sortie de "j'ai échoué parce que je ne peux pas recréer la tableXYZ
à partir du néant; restaurer manuellement la tableXYZ
de sauvegarde, puis exécutez de nouveau de moi, et je ne manquerai pas de vous!")Si vous êtes à la destruction des données, vous pouvez faire une sauvegarde avant.
par exemple,
Avoir réversible, la migration est très bien pour le développement et la mise en scène, mais en supposant bien testé le code, il devrait être extrêmement rare que vous ne pourriez jamais vouloir migrer vers le bas dans la production. Je construis dans ma migrations automatique IrreversibleMigration en mode de production. Si j'en avais vraiment besoin pour inverser un changement, je pourrais utiliser un autre "jusqu'à" la migration ou de la suppression de l'exception. Qui semble louche si. Un bug qui causait un scénario grave à ce point est un signe que le processus d'assurance qualité est sérieusement foiré.
Se sentir comme vous avez besoin d'un irréversible de la migration est probablement un signe que vous avez de plus gros problèmes qui se profilent. Peut-être que certains détails pourraient aider?
Quant à votre deuxième question: je prends toujours le "effort" pour écrire l'inverse de migrations. Bien sûr, je n'est pas à l'écriture de la
.down
, TextMate insère automatiquement lors de la création de la.up
.Réversible, La Migration Des Données permet de créer facilement réversible, les migrations de données à l'aide de fichiers yaml.
IIRC, vous aurez la IrreversibleMigration lors de la modification d'un type de données dans la migration.
Je pense à une autre situation, quand c'est ok, c'est quand vous avez un consolidés de la migration. Dans ce cas, un "bas" n'a pas vraiment de sens, car elle permettrait de supprimer tous les tableaux (à l'exception des tableaux ajouté après la consolidation). Ce n'est probablement pas ce que vous voulez.