45 votes

Quand (si) consolider les migrations ActiveRecord?

Comme je l'ai déplacer à travers les itérations sur mon application*le(s) - je accumuler des migrations. Comme de juste il y a maintenant 48 de tels fichiers, s'étendant sur une période de 24 mois d'activité.

J'envisage de prendre ma schema.rb et de faire que la ligne de base.

J'envisage aussi de supprimer (sous réserve de contrôle à la source, bien sûr) de l'existant, des migrations et de la création d'un beau brillant nouveau single de la migration de mon schéma actuel? Les Migrations ont tendance à aimer les symboles, mais rake db:schema:dump utilise des chaînes: dois-je prendre soin?

Est-ce que semblent de bon sens? Si oui, quelle sorte d'intervalle serait un tel exercice de sens? Si non, pourquoi pas?

Et je suis pas certains (râteau?) la tâche qui permettrait de faire cela pour moi?

* Dans mon cas, toutes les applications sont Rails de base, mais tout ce qui utilise ActiveRecord migrations semblent s'adapter à la question.

36voto

ndp Points 8959

Oui, cela a du sens. Il y a une pratique de la consolidation des migrations. Pour ce faire, il suffit de copier le schéma actuel dans une migration, et de supprimer tous les migrations antérieures. Ensuite, vous avez moins de fichiers à gérer, et les tests peuvent s'exécuter plus rapidement. Vous devez être prudent de faire cela, surtout si vous avez des migrations exécute automatiquement sur la production. De manière générale, j'remplacer une migration que je sais que tout le monde a couru avec le nouveau schéma d'un.

D'autres personnes sont légèrement différentes façons de le faire.

En général, je n'ai pas fait cela jusqu'à ce que nous avions de plus de 100 migrations, mais nous pouvons atteindre cette après quelques mois de développement. À mesure que le projet mûrit, cependant, les migrations viennent de moins en moins souvent, de sorte que vous pouvez ne pas avoir à le faire à nouveau.

Ce n'est aller à l'encontre d'une meilleure pratique: une Fois que vous signez une migration de contrôle de code source, de ne pas l'altérer. Je fais une exception rare si il y a un bug dans l'un, mais cela est assez rare (1 cas sur 100 peut-être). La raison en est que, une fois qu'ils sont dans la nature, certaines personnes peuvent les exécuter. Ils sont enregistrés comme étant terminée dans la db. Si vous changez de contrôle et dans une nouvelle version, d'autres personnes ne seront pas obtenir le bénéfice de la modification. Vous pouvez demander aux gens de faire reculer certaines modifications, et de les relancer, mais cela va à l'encontre du but de l'automatisation. Fait souvent, il devient un gâchis. C'est mieux de le laisser seul.

7voto

giorgian Points 2754

Je pense qu'il y a deux types de migration:

  • ceux que vous avez faits lors de la conception/développement, parce que vous avez changé d'avis sur la façon dont votre base de données devrait être comme;

  • ceux que vous faites entre les versions, reflétant des changements de comportement.

- Je me débarrasser de la première sorte de migrations dès que je peux, car ils ne représentent pas de travail sur les rejets, et de garder la seconde espèce, de sorte qu'il est possible, en théorie, à la mise à jour de l'application.

A propos des symboles vs chaînes: beaucoup affirment que seules les chaînes doivent être utilisés dans les migrations: les symboles sont destinés à être des "poignées" pour les objets, et ne doit pas être utilisé pour représenter les noms de colonne les noms de table et, dans ce cas). Ce n'est qu'une simple considération stylistique, mais m'a convaincu, et je ne suis pas plus à l'aide de symboles dans les migrations.

J'ai lu un autre point à l'aide de cordes: "ruby symboles sont des fuites de mémoire", ce qui signifie que, lorsque vous créez un symbole, ce n'est jamais disposé de tous les temps de la vie. Cela semble tout à fait inutile pour moi, ainsi que tous vos db colonnes seront utilisés comme des symboles sur les Rails (et ActiveRecord) application; la migration de tâche, aussi, ne durera pas éternellement, donc je ne pense pas que ce point fait réellement sens.

4voto

PatrickTulskie Points 380

Avoir beaucoup de migrations sont une bonne chose. Combiné avec le système de contrôle de version, ils vous permettent de voir ce que les développeurs de modification de la base de données et pourquoi. Ce qui contribue à la reddition de comptes. Enlever tout à fait de cette une grande dispute.

Si vous voulez vraiment obtenir une nouvelle base de données et exécuter rapidement, vous pouvez simplement charger le schéma avec le rake db:schéma:charge RAILS_ENV=your_environment et si vous souhaitez obtenir votre base de données de test d'installation rapide vous pouvez simplement utiliser rake db:test:préparer

Cela étant dit, si vraiment vous voulez consolider votre migrations ensuite, j'ai créer une nouvelle migration qui vérifie pour voir si la dernière migration de votre ensemble a été effectué (ex: la colonne que vous avez ajouté existent-ils?) et si non, alors il sera le feu. Sinon, la migration sera juste ajouter à la schéma de la table comme terminée afin de ne pas tenter de le feu encore une fois.

Juste communiquer ce que vous faites pour le reste de votre équipe afin qu'ils comprennent ce qui se passe, de peur qu'ils aveuglément incendie à une rake db:migrate et vis quelque chose qu'ils avaient déjà.

3voto

adric Points 141

Le haut du schéma.rb déclare:

# This file is auto-generated from the current state of the database. Instead of editing this file, 
# please use the migrations feature of Active Record to incrementally modify your database, and
# then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your database schema. If you need
# to create the application database on another system, you should be using db:schema:load, not running
# all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended to check this file into your version control system.

Je dois endosser ce [giorgian] dit ci-dessus à propos de migrations différentes à des fins différentes. Je recommande le nettoyage axée sur le développement, les migrations, le long de avec d'autres tâches que vous faites lorsque vous branche pour une version. Qui fonctionne bien pour moi, pour moi et pour les petites équipes. Bien sûr, mon application principale se trouve au sommet et entre les deux autres bases de données avec leurs propres schémas qui, je dois être prudent de nous utilisons donc des migrations (plutôt que du schéma restauration) pour une nouvelle installation et de ceux qui doivent survivre à la libération de l'ingénierie.

1voto

tadman Points 70178

Même si je suis sûr que tout le monde a ses propres pratiques, il y a quelques règles implicites par la façon dont la migration fonctionne le système:

  • Ne jamais s'engager dans des changements de migrations qui peuvent avoir été utilisés par d'autres développeurs ou précédents déploiements. Au lieu de cela, faire une migration supplémentaire pour régler les choses comme nécessaires.
  • Ne jamais mettre le modèle des dépendances au niveau de la migration. Le modèle peut être renommé ou supprimé à un certain moment dans l'avenir, et cela permettrait d'éviter la migration. Garder la migration aussi autonomes que possible, même si cela signifie qu'il est tout à fait simpliste et de bas niveau.

Bien sûr il y a des exceptions. Par exemple, si une migration ne fonctionne pas, pour quelque raison que ce soit, un patch peut être nécessaire de le mettre à jour. Même alors, cependant, la nature des changements opérés par la migration ne devrait pas changer, mais la mise en œuvre de peut.

Tout mature Rails de projet aura probablement autour de 200 à 1000 migrations. Dans mon expérience, il est rare de voir un projet avec moins de 30 sauf dans les étapes de planification. Chaque modèle, après tout, généralement des besoins de son propre fichier de migration.

L'effondrement de plusieurs migrations en un seul est une mauvaise habitude à prendre lorsque l'on travaille sur l'évolution d'une pièce de logiciel. Vous n'avez probablement pas l'effondrement de votre contrôle de la source de l'histoire, alors pourquoi s'inquiéter de schéma de base de données de l'histoire?

Le seul cas que je vois comme étant raisonnablement pratique est si vous êtes bifurquer un vieux projet de création d'une nouvelle version ou un spin-off et ne veulent pas avoir à porter de l'avant avec un nombre extraordinaire de migrations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X