ruby on rails remove Rebase les migrations Rails dans un projet de longue durée




rails rollback last migration (3)

Pour automatiser la fusion (ou la compression) des migrations, vous pouvez utiliser la gem Squasher.

Il suffit d'installer

gem install squasher

Et exécutez avec une date, et les migrations avant cette date seront fusionnées:

squasher 2016 # => Will merge all migration created before 2016

Plus de détails dans le fichier README

Dans ce que je veux dire "rebasement" dans le dictionnaire, plutôt que la définition git ...

J'ai un grand projet Rails de longue haleine comptant environ 250 migrations. Il est difficile de gérer toutes ces tâches.

Cela dit, j'ai besoin d'une base pour purger et reconstruire ma base de données lors de l'exécution de tests. Les données contenues dans ces données sont donc importantes.

Quelqu'un a-t-il des stratégies pour, par exemple, vider le schéma à un moment donné - archiver toutes les anciennes migrations et recommencer à zéro avec de nouvelles migrations?

Évidemment, je peux utiliser rake schema: dump - mais j'ai vraiment besoin d'un moyen pour que db: migrate charge le schéma en premier, puis commence à exécuter le reste des migrations.

J'aimerais continuer à utiliser les migrations car elles sont très utiles au développement. Cependant, je ne reviens pas en arrière et édite une migration de 2007, il semble donc ridicule de la conserver.


En plus de la réponse fournie (qui indique bien comment consolider votre volume de migrations), vous indiquez un souci de purge des données (qui, je suppose, est ajouté manuellement après que les fixtures ont rempli vos tables); ce qui implique que vous dépendez de l'actualisation d'un état de données initial. Certains projets nécessitent en effet un raffinement intensif des données de base, une reconstruction et un repeuplement des tableaux. Nous dépendons beaucoup de l'exécution répétitive de ces opérations, et j'ai constaté que si vous pouviez entièrement réduire votre schéma à des instructions d'exécution SQL, vos tables seraient reconstruites beaucoup plus rapidement qu'avec la syntaxe Ruby.

Une aide supplémentaire simple pour reconstruire vos tables consiste à dédier une fenêtre de terminal séparée à une seule instruction de commande combinée:

rake db: drop db: create db: schema: load db: fixtures: load

Chaque fois que vous avez besoin de reconstruire et de repeupler vos tables, une flèche vers le haut et un retour au clavier effectueront ce travail de routine. S'il n'y a pas de conflit dans les instructions d'exécution SQL et si vous n'avez pas d'autres migrations à exécuter pendant que votre projet est en développement, les instructions SQL s'exécuteront peut-être mieux que deux fois plus vite que la syntaxe Ruby. Par exemple, nos tables reconstruisent et regarnissent en 20 secondes, alors que la syntaxe Ruby augmente le processus à plus de 50 secondes. Si vous attendez que les données soient actualisées pour effectuer un travail supplémentaire (en particulier plusieurs fois), cela fait une énorme différence en termes de flux de travail.


En général, vous n'avez pas besoin de nettoyer les anciennes migrations. Si vous exécutez db: migrate from scratch (aucune base de données existante), Rails utilise db / schema.rb pour créer les tables au lieu d'exécuter toutes les migrations. Sinon, il n'exécute que les migrations requises pour mettre à niveau le schéma actuel vers le dernier.

Si vous souhaitez toujours combiner les migrations jusqu'à un point donné en un seul, vous pouvez essayer de:

  • migrer de zéro vers le schéma ciblé à l'aide de rake db:migrate VERSION=xxx
  • dump le schéma en utilisant rake db:schema:dump
  • supprimez les migrations depuis le début jusqu'à la version xxx et créez une nouvelle migration unique en utilisant le contenu de db / schema.rb (insérez les instructions create_table et add_index dans la méthode self.up de la nouvelle migration).

Assurez-vous de choisir l'un des anciens numéros de version de migration pour votre nouvelle migration agrégée. sinon, Rails essaierait d'appliquer cette migration sur votre serveur de production (ce qui effacerait vos données existantes, car les instructions create_table utilisent: force⇒true).

Quoi qu'il en soit, je ne le recommanderais pas, car Rails gère généralement bien les migrations. Mais si vous voulez toujours, vérifiez tout et essayez d'abord localement avant de risquer de perdre des données sur votre serveur de production.





migration