Je travaille sur une application rails avec pas mal de branches git et beaucoup d'entre elles incluent des migrations db. Nous essayons d'être prudents, mais parfois un morceau de code dans master demande une colonne qui a été supprimée / renommée dans une autre branche.
Quelle serait une bonne solution pour "coupler" des branches git avec des états DB?
Quels seraient réellement ces «états»?
Nous ne pouvons pas simplement dupliquer une base de données si sa taille est de quelques Go.
Et que devrait-il se passer avec les fusions?
La solution se traduirait-elle également par des bases de données noSQL?
Nous utilisons actuellement MySQL, mongodb et redis
EDIT: On dirait que j'ai oublié de mentionner un point très important, je ne suis intéressé que par l' environnement de développement mais avec de grandes bases de données (quelques Go de taille).
la source
Réponses:
Lorsque vous ajoutez une nouvelle migration dans une branche, exécutez
rake db:migrate
et validez à la fois la migration etdb/schema.rb
Si vous faites cela, en développement, vous pourrez passer à une autre branche qui a un ensemble différent de migrations et simplement exécuter
rake db:schema:load
.Notez que cela recréera toute la base de données et que les données existantes seront perdues .
Vous ne voudrez probablement exécuter la production qu'à partir d'une branche avec laquelle vous êtes très prudent, donc ces étapes ne s'appliquent pas ici (exécutez simplement
rake db:migrate
comme d'habitude). Mais en développement, recréer la base de données à partir du schéma ne devrait pas être un problème, ce quirake db:schema:load
fera l'affaire.la source
db/seeds.rb
Il ne devrait pas être trop dévastateur de détruire votre base de données de développement si vous y configurez des données de départ raisonnables.db/seeds.rb
pour ripopuler les données de base de donnéesSi vous avez une grande base de données que vous ne pouvez pas facilement reproduire, je vous recommande d'utiliser les outils de migration normaux. Si vous voulez un processus simple, voici ce que je vous recommande:
rake db:rollback
) à l'état avant le point de branchement. Ensuite, après avoir changé de branche, exécutezdb:migrate
. C'est mathématiquement correct, et tant que vous écrivez desdown
scripts, cela fonctionnera.la source
rake db:schema:load
etrake db:seed
comme @noodl l'avait dit.Voici un script que j'ai écrit pour basculer entre les branches contenant différentes migrations:
https://gist.github.com/4076864
Cela ne résoudra pas tous les problèmes que vous avez mentionnés, mais avec un nom de branche, cela:
Je me retrouve à faire cela manuellement tout le temps sur notre projet, alors j'ai pensé que ce serait bien d'automatiser le processus.
la source
git checkout db/schema.rb
ou vouliez-vous diregit checkout -- db/schema.rb
? (c'est-à-dire avec des tirets doubles)db/schema.rb
. :)Base de données distincte pour chaque succursale
C'est la seule façon de voler.
Mise à jour 16 octobre 2017
J'y suis revenu après un certain temps et j'ai apporté quelques améliorations:
bundle exec rake git:branch
.db:clone_from_branch
tâche prend une variable d'environnementSOURCE_BRANCH
et uneTARGET_BRANCH
. Lors de son utilisation,git:branch
il utilisera automatiquement la branche actuelle comme fichierSOURCE_BRANCH
.config/database.yml
Et pour vous faciliter la tâche, voici comment mettre à jour votre
database.yml
fichier pour déterminer dynamiquement le nom de la base de données en fonction de la branche actuelle.lib/tasks/db.rake
Voici une tâche Rake pour cloner facilement votre base de données d'une branche à une autre. Cela prend une
SOURCE_BRANCH
et uneTARGET_BRANCH
variables d'environnement. Basé sur la tâche de @spalladino .lib/tasks/git.rake
Cette tâche créera une branche git hors de la branche actuelle (maître ou autre), la récupérera et clonera la base de données de la branche actuelle dans la base de données de la nouvelle branche. C'est AF lisse.
Maintenant, tout ce que vous avez à faire est de courir
bundle exec git:branch
, entrez le nouveau nom de branche et commencez à tuer des zombies.la source
Peut-être devriez-vous prendre cela comme un indice que votre base de données de développement est trop grande? Si vous pouvez utiliser db / seedss.rb et un ensemble de données plus petit pour le développement, votre problème peut être facilement résolu en utilisant schema.rb et seeds.rb de la branche actuelle.
Cela suppose que votre question concerne le développement; Je ne peux pas imaginer pourquoi vous auriez besoin de changer régulièrement de branche en production.
la source
db/seeds.rb
, je vais y jeter un coup d'oeil.J'étais aux prises avec le même problème. Voici ma solution:
Assurez-vous que schema.rb et toutes les migrations sont archivés par tous les développeurs.
Il doit y avoir une personne / machine pour les déploiements en production. Appelons cette machine comme la machine de fusion. Lorsque les modifications sont extraites de la machine de fusion, la fusion automatique de schema.rb échoue. Pas d'issues. Remplacez simplement le contenu par le contenu précédent de schema.rb (vous pouvez mettre une copie de côté ou l'obtenir depuis github si vous l'utilisez ...).
Voici l'étape importante. Les migrations de tous les développeurs seront désormais disponibles dans le dossier db / migrate. Allez-y et exécutez bundle exec rake db: migrate. Cela mettra la base de données sur la machine de fusion au pair avec tous les changements. Il régénérera également schema.rb.
Validez et transmettez les modifications à tous les référentiels (télécommandes et individus, qui sont également des télécommandes). Tu devrais avoir fini!
la source
C'est ce que j'ai fait et je ne suis pas sûr d'avoir couvert toutes les bases:
En développement (en utilisant postgresql):
C'est beaucoup plus rapide que les utilitaires de rake sur une base de données avec environ 50K enregistrements.
Pour la production, maintenez la branche master comme sacro-sainte et toutes les migrations sont archivées, shema.rb correctement fusionné. Suivez votre procédure de mise à niveau standard.
la source
Vous souhaitez conserver un "environnement db" par branche. Regardez le script smudge / clean pour pointer vers différentes instances. Si vous manquez d'instances de base de données, faites tourner le script d'une instance temporaire afin que lorsque vous passez à une nouvelle branche, elle est déjà là et doit simplement être renommée par le script. Les mises à jour de la base de données doivent s'exécuter juste avant d'exécuter vos tests.
J'espère que cela t'aides.
la source
Je vis totalement le pita que vous avez ici. En y réfléchissant, le vrai problème est que toutes les branches n'ont pas le code pour restaurer certaines branches. Je suis dans le monde du django, donc je ne connais pas bien le rake. Je joue avec l'idée que les migrations vivent dans leur propre repo qui ne se ramifie pas (git-submodule, dont j'ai récemment entendu parler). De cette façon, toutes les branches ont toutes les migrations. La partie collante est de s'assurer que chaque branche est limitée aux seules migrations qui les intéressent. Faire / garder une trace de cela manuellement serait un pita et sujet à l'erreur. Mais aucun des outils de migration n'est conçu pour cela. C’est à ce stade que je suis sans issue.
la source
Je suggérerais l'une des deux options suivantes:
Option 1
seeds.rb
. Une bonne option consiste à créer vos données de départ via la gemme FactoryGirl / Fabrication. De cette façon, vous pouvez garantir que les données sont synchronisées avec le code si nous supposons que les usines sont mises à jour avec l'ajout / la suppression de colonnes.rake db:reset
, ce qui supprime / crée / amorce efficacement la base de données.Option 2
Gérez manuellement les états de la base de données en exécutant toujours
rake db:rollback
/rake db:migrate
avant / après une extraction de branche. La mise en garde est que toutes vos migrations doivent être réversibles, sinon cela ne fonctionnera pas.la source
Sur l'environnement de développement:
Vous devriez travailler avec
rake db:migrate:redo
pour tester si votre script est réversible, mais gardez à l'esprit que vous devriez toujours avoir unseed.rb
avec la population de données.Si vous travaillez avec git, votre seed.rb devrait être modifié avec un changement de migration, et l'exécution de
db:migrate:redo
pour le début (charger les données pour un nouveau développement sur une autre machine ou une nouvelle base de données)Hormis le «changement», avec les vôtres méthodes de haut en bas, votre code sera toujours des scénarios de couverture pour le «changement» en ce moment et lorsque vous partez de zéro.
la source