Comment modifier votre schéma de base de données?
comment préparez-vous vos deltas SQL? enregistrez-vous manuellement chaque changement de schéma SQL dans un dossier delta, ou avez-vous une sorte de processus de diffing automatisé?
je suis intéressé par les conventions pour versionner le schéma de base de données avec le code source. Peut-être un crochet pré-commit qui diffs le schéma?
en outre, quelles sont les options de deltas diffing existent en dehors de DbDeploy ?
Modifier: voir les réponses je voudrais clarifier que je suis familier avec le schéma standard pour exécuter une migration de base de données en utilisant des deltas. Ma question porte sur la création des deltas eux-mêmes, de préférence automatiquement.
aussi, le versioning est pour PHP et MySQL si cela fait une différence. (Pas de Ruby solutions s'il vous plait).
17 réponses
voir
comment modifier ma base de données MS SQL dans SVN?
et L'article de Jeff
Obtenir Votre Base De Données Sous Contrôle De Version
je ressens votre douleur, et j'aimerais qu'il y ait une meilleure réponse. Cela pourrait être plus proche de ce que vous avez été à la recherche pour.
mécanismes de suivi des modifications du schéma de freinage rhéostatique
en général, je pense qu'il n'y a pas de solution adéquate, acceptée, et je roule ma propre dans ce domaine.
vous pourriez jeter un oeil à un autre, fil similaire: Comment puis-je version de ma base de données MS SQL dans SVN? .
si vous êtes toujours à la recherche d'options : consultez neXtep designer. Il s'agit d'un environnement libre de développement de base de données GPL basé sur les concepts de contrôle de version. Dans l'environnement, vous travaillez toujours avec des entités suivies en versions et pouvez vous concentrer sur le développement du modèle de données. Une fois qu'une version est terminée, le moteur de génération SQL branché sur le système de contrôle de version peut générer n'importe quel delta dont vous avez besoin entre 2 versions, et vous offrira un mécanisme de livraison si vous avez besoin.
entre autres choses, vous pouvez synchroniser et inverser la synchronisation de votre base de données pendant les développements, créer des diagrammes de modèle de données, interroger votre base de données en utilisant des clients SQL intégrés, etc.
consultez le wiki pour plus d'informations : http://www.nextep-softwares.com/wiki
il prend actuellement en charge Oracle, MySql et PostgreSql et est en java de sorte que le produit fonctionne sur windows, linux et mac.
Je ne gère pas les deltas. Je fais des changements à une base de données principale et j'ai un outil qui crée un script de construction basé sur XML basé sur la base de données principale.
quand vient le temps de mettre à jour une base de données existante, j'ai un programme qui utilise le script de construction basé sur XML pour créer une nouvelle base de données et les tables nues. Je copie alors les données de l'ancienne base de données en utilisant INSERT dans x SELECT de y et puis applique tous les index, les contraintes et les déclencheurs.
nouvelles tables, nouvelles Colonnes, Colonnes supprimées sont toutes manipulées automatiquement et avec quelques petites astuces pour ajuster la routine de copie, je peux gérer les renommages de colonne, les changements de type de colonne et d'autres remaniements de base.
Je ne recommande pas cette solution sur une base de données avec une énorme quantité de données, mais je mets régulièrement à jour une base de données qui est plus de 1 Go avec 400 tables.
vous n'avez pas mentionné quels RDBMS vous utilisez, mais si C'est le serveur MS SQL, Le de Red-Gate Compare nous a été indispensable pour créer des deltas entre les scripts de création d'objets.
Je ne suis pas du genre à me vanter, mais j'ai développé une application Web interne pour suivre les changements dans les schémas de base de données et créer des scripts de mise à jour avec versions.
cet outil est appelé Brésil et est maintenant open source sous une licence MIT. Le Brésil est ruby / ruby on rails basé et soutient le déploiement de changement à n'importe quelle base de données que Ruby dBi soutient (MySQL, ODBC, Oracle, Postgres, SQLite).
le Soutien à l' mettre les scripts de mise à jour dans le contrôle de version est prévu.
http://bitbucket.org/idler/mmp - outil de version de schéma pour mysql, écrit en PHP
Je m'assure que les changements de schéma sont toujours additifs. Donc je ne laisse pas tomber les colonnes et les tables, parce que cela zapperait les données et ne peut pas être retranché plus tard. De cette façon, le code qui utilise la base de données peut être retranché sans perte de données ou de fonctionnalités.
j'ai un script de migration qui contient des instructions qui crée des tables et des colonnes si elles n'existent pas encore et les remplit avec des données.
le script de migration s'exécute chaque fois que le le code de production est mis à jour et après de nouvelles installations.
quand je voudrais laisser tomber quelque chose, je le fais en le retirant du script d'installation de la base de données et du script de migration de sorte que ces éléments de schéma obsolètes seront progressivement éliminés dans de nouvelles installations. Avec l'inconvénient que les nouvelles installations ne peuvent pas passer à une version plus ancienne avant l'installation.
et bien sûr j'exécute DDLs via ces scripts et jamais directement sur la base de données pour garder les choses la synchronisation.
nous exportons les données dans un format portable (en utilisant notre chaîne d'Outils), puis nous les importons dans un nouveau schéma. pas besoin de delta SQL. Fortement recommandé.
j'utilise Firebird de la base de données pour plus de développement et d'utilisation de la FlameRobin de l'outil d'administration. Il a une belle option pour enregistrer tous les changements. Il peut tout enregistrer dans un seul gros fichier, ou un fichier par modification de base de données. J'utilise cette deuxième option, puis je stocke chaque script dans le logiciel de contrôle de version - plus tôt J'ai utilisé Subversion, maintenant J'utilise Git.
je suppose que vous pouvez trouver un outil MySQL qui a la même journalisation comme FlameRobin pour Firebird.
dans l'une des tables de base de données, je stocke le numéro de version de la structure de base de données, de sorte que je peux mettre à jour n'importe quelle base de données facilement. J'ai aussi écrit un script PHP simple qui exécute ces scripts SQL un par un sur n'importe quelle base de données cible (le chemin de base de données et le nom d'utilisateur/mot de passe sont fournis sur la ligne de commande).
il y a aussi une option pour enregistrer toutes les déclarations DML (insérer, mettre à jour supprimer), et I activez ceci tout en modifiant certaines données "par défaut" que contient chaque base de données.
j'ai écrit un beau livre blanc sur la façon dont je fais tout cela en détail. Vous pouvez télécharger le document en .format pdf avec les scripts de démonstration PHP de ici .
j'ai également développé un ensemble de scripts PHP où les développeurs peuvent soumettre leurs scripts deltasql à un dépôt central.
dans l'une des tables de base de données (appelée TBSYNCHRONIZE), je stocke le numéro de version du dernier script exécuté, de sorte que je puisse mettre à jour n'importe quelle base de données facilement en utilisant l'interface web ou un client développé sur le but pour Eclipse.
l'interface web permet de gérer plusieurs projets. Il supporte aussi la base de données "branches".
vous pouvez tester l'application à http://www.gpu-grid.net/deltasql (si vous vous connectez en tant qu'administrateur avec mot de passe testdbsync). L'application est open source et peut être téléchargé ici: http://sourceforge.net/projects/deltasql
deltasql est utilisé de manière productive en Suisse et en Inde, et est populaire au Japon.
il y a quelques mois, j'ai cherché dans tool for versioning MySQL schema. J'ai trouvé de nombreux outils utiles, comme la migration Doctrine, la migration RoR, certains outils écrits en Java et en Python.
mais aucun d'entre eux n'a été satisfait mes exigences.
mes exigences:
- Pas d'exigences exclure PHP et MySQL
- pas de fichiers de configuration schema, comme schema.yml dans la Doctrine
- en Mesure pour lire le schéma courant de la connexion et créer un nouveau script de migration, que représentent le schéma identique dans d'autres installations de l'application.
j'ai commencé à écrire mon outil de migration, et aujourd'hui j'ai la version bêta.
s'il vous Plaît, essayez, si vous avez un intérêt pour ce sujet. S'il vous plaît envoyez-moi des demandes futures et bugreports.
code Source: bitbucket.org/idler/mmp/src Présentation en anglais: bitbucket.org/idler/mmp/wiki/Home Vue d'ensemble en russe: antonoff.info/development/mysql-migration-with-php-project
ce sujet m'intéresse aussi.
Il y a certaines discussions sur ce sujet dans le Django wiki .
fait intéressant, il ressemble à CakePHP a un schéma de version intégré en utilisant juste la commande cake schema generate
.
Pour MySQL
quand j'atterris sur un nouveau DB:
tout D'abord, je vérifie la structure:
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt cat DIFF_FILENAME.txt | less
grâce aux utilisateurs de stackoverflow je pourrais écrire ce script rapide pour trouver des différences de structure.
src: https://stackoverflow.com/a/8718572/4457531 & https://stackoverflow.com/a/26328331/4457531
dans une deuxième étape, je vérifie les données, table par table avec mysqldiff
. C'est un peu archaïque mais une boucle php basée sur information_schema
les données font sûrement du travail
pour le versioning, j'utilise la même façon, mais j'ai formaté un script de mise à jour SQL (pour mettre à niveau ou faire un rollback) avec des résultats diff et j'utilise la convention de numéro de version (avec plusieurs modifications le numéro de version ressemble à une adresse ip) .
initial version : 1.0.0
^ ^ ^
| | |
structure change: - | |
datas added: -------- |
datas updated: --------
j'utilise la version stricte du schéma de la base de données (tracée dans une table séparée). Les Scripts sont stockés dans le contrôle de version, mais ils vérifient tous la version de schéma actuelle avant de faire n'importe quel changement.
Voici l'implémentation complète pour SQL Server (la même solution pourrait être développée pour MySQL si nécessaire): Comment maintenir le schéma de base de données SQL Server Version
après une longue enquête, j'ai compris qu'il y a des outils de tierce partie ou des types de projet de studio visuel qui ne me satisfont pas, ou juste des blogs sur la théorie mais pas d'implémentation. J'ai donc mis en place un système de travail, qui est utilisé presque un an, et expliqué ici:
http://nalgorithm.com/2015/11/09/database-versioning-part-1 /
selon l'intérêt, continuera à écrire plus.