web-dev-qa-db-fra.com

Comment versionnez-vous votre schéma de base de données?

Comment préparez-vous vos deltas SQL? Enregistrez-vous manuellement chaque code SQL qui modifie le schéma dans un dossier delta ou disposez-vous d’une sorte de processus de différenciation automatisé?

Je suis intéressé par les conventions relatives au schéma de base de données de gestion de versions avec le code source. Peut-être un hook de pré-commit qui diffs le schéma?

En outre, quelles options pour différencier les deltas existent en dehors de DbDeploy ?

EDIT: Voir les réponses J'aimerais préciser que je connais bien le schéma standard pour exécuter une migration de base de données à l'aide de deltas. Ma question concerne la création des deltas eux-mêmes, de préférence automatiquement.

De plus, le contrôle de version est pour PHP et MySQL si cela fait une différence. (Non Ruby solutions s'il vous plaît)).

123
Eran Galperin

Voir

Existe-t-il un système de contrôle de version pour les modifications de structure de la base de données?

Comment mettre à jour ma base de données MS SQL sous SVN?

et l'article de Jeff

Obtenez 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 cherchiez.

Mécanismes de suivi des modifications du schéma de la base de données

De manière générale, j’estime qu’il n’existe pas de solution adéquate et acceptée à cet égard, et j’investis moi-même dans ce domaine.

59
harpo

Si vous êtes toujours à la recherche d'options, consultez le concepteur neXtep. C'est un environnement de développement de base de données GPL gratuit basé sur les concepts de contrôle de version. Dans l'environnement, vous travaillez toujours avec des entités versionnées et pouvez vous concentrer sur le développement du modèle de données. Une fois qu'une publication est terminée, le moteur de génération SQL branché sur le système de contrôle de version peut générer tout delta dont vous avez besoin entre deux versions et vous offrira un mécanisme de livraison si vous en avez besoin.

Entre autres choses, vous pouvez synchroniser et inverser la synchronisation de votre base de données au cours des développements, créer des diagrammes de modèle de données, interroger votre base de données à l'aide de clients SQL intégrés, etc.

Consultez le wiki pour plus d'informations: http://www.nextep-softwares.com/wiki

Il supporte actuellement Oracle, MySql et PostgreSql et se trouve dans Java), de sorte que le produit fonctionne sous Windows, Linux et mac.

4

Vous pouvez jeter un oeil sur un autre thread similaire: Comment puis-je mettre à jour ma base de données MS SQL dans SVN? .

4
Jason Jackson

Je m'assure que les changements de schéma sont toujours additifs. Donc, je ne supprime pas les colonnes et les tables, car cela zapperait les données et ne pourrait pas être annulé plus tard. De cette manière, le code qui utilise la base de données peut être annulé sans perte de données ou de fonctionnalités.

J'ai un script de migration qui contient des instructions qui créent des tables et des colonnes si elles n'existent pas encore et les remplissent de données.

Le script de migration s'exécute chaque fois que le code de production est mis à jour et après de nouvelles installations.

Lorsque je souhaite supprimer quelque chose, je le fais en le supprimant du script d'installation de la base de données et du script de migration afin que ces éléments de schéma obsolètes soient progressivement supprimés dans les nouvelles installations. Avec le désavantage que les nouvelles installations ne peuvent pas rétrograder à une version antérieure avant l’installation.

Et bien sûr, j'exécute les DDL via ces scripts et jamais directement sur la base de données pour que tout soit synchronisé.

3
Calmarius

http://bitbucket.org/idler/mmp - Outil de gestion de versions de schéma pour mysql, écrit en PHP

2
user381751

Je ne suis pas du genre à me vanter, mais j'ai développé une application Web interne pour suivre les modifications apportées aux schémas de base de données et créer des scripts de mise à jour versionnés.

Cet outil s'appelle Brésil et est maintenant open source sous une licence MIT). Le Brésil est Ruby/Ruby sur Rails et prend en charge le déploiement de modifications sur toute base de données prise en charge par Ruby DBI (MySQL, ODBC, Oracle, Postgres, SQLite).

La prise en charge de la mise en contrôle de version des scripts de mise à jour est prévue.

2
Joakim Bodin

Je ne gère pas les deltas. J'apporte des modifications à une base de données master et un outil crée un script de construction basé sur XML basé sur la base de données master.

Lorsque vient le temps de mettre à niveau 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 ensuite les données de l'ancienne base de données à l'aide de INSERT INTO x SELECT FROM, puis j'applique tous les index, contraintes et déclencheurs.

Les nouvelles tables, les nouvelles colonnes, les colonnes supprimées sont toutes gérées automatiquement et avec quelques petites astuces pour ajuster la routine de copie, je peux gérer les renommements de colonne, les modifications de type de colonne et d’autres refactorisations de base.

Je ne recommanderais pas cette solution sur une base de données contenant une énorme quantité de données, mais je mets régulièrement à jour une base de données de plus de 1 Go avec 400 tables.

2
Darrel Miller

Vous n'avez pas mentionné le SGBDR que vous utilisez, mais s'il s'agit de MS SQL Server, le fichier SQL Compare de Red-Gate nous a été indispensable pour créer des deltas entre les scripts de création d'objets.

2
jalbert

J'utilise la base de données Firebird pour la plupart des développements et j'utilise l'outil d'administration FlameRobin . Il a une option intéressante pour enregistrer toutes les modifications. Il peut enregistrer tout dans un grand fichier ou un fichier par modification de base de données. J'utilise cette seconde option, puis je stocke chaque script dans un logiciel de contrôle de version. J'utilisais auparavant Subversion, maintenant j'utilise Git.

Je suppose que vous pouvez trouver un outil MySQL doté de la même fonctionnalité de journalisation que FlameRobin pour Firebird.

Dans l'une des tables de base de données, je stocke le numéro de version de la structure de la base de données, ce qui me permet de mettre à niveau facilement toute base de données. J'ai également écrit un simple script PHP qui exécute ces scripts SQL un par un sur n'importe quelle base de données cible (le chemin d'accès à la base de données et le nom d'utilisateur/mot de passe sont fournis sur la ligne de commande).

Il existe également une option pour consigner toutes les instructions DML (insertion, mise à jour, suppression) et je l’active lorsque je modifie 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 au format .pdf avec la démo PHP scripts de ici .

1
Milan Babuškov

Il y a quelques mois, j'ai cherché un outil pour la gestion de versions du schéma MySQL. J'ai trouvé de nombreux outils utiles, tels que Doctrine, migration de RoR, certains outils décrits dans Java et Python.

Mais aucun d'entre eux n'a été satisfait de mes exigences.

Mes exigences:

  1. Aucune exigence, excluez PHP et MySQL
  2. Aucun fichier de configuration de schéma, comme schema.yml dans Doctrine
  3. Capable de lire le schéma actuel depuis la connexion et de créer un nouveau script de migration, il représente un schéma identique dans d'autres installations de l'application.

J'ai commencé à écrire mon outil de migration et j'ai aujourd'hui la version bêta.

S'il vous plaît, essayez-le si vous êtes intéressé par ce sujet. S'il vous plaît envoyez-moi des demandes futures et rapports de bugs.

Code source: bitbucket.org/idler/mmp/src Présentation en anglais: bitbucket.org/idler/mmp/wiki/Home Présentation en russe: antonoff.info/development/mysql-migration-with-php-project

1
Maxim Antonov

J'ai également développé un ensemble de scripts PHP) permettant aux développeurs de soumettre leurs scripts deltasql à un référentiel 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é afin de pouvoir mettre à niveau facilement toute base de données à l'aide de l'interface Web ou d'un client développé spécialement pour Eclipse.

L'interface Web permet de gérer plusieurs projets. Il supporte également la base de données "branches".

Vous pouvez tester l'application à l'adresse http://www.gpu-grid.net/deltasql (si vous vous connectez en tant qu'administrateur avec le mot de passe testdbsync). L'application est open source et peut être téléchargée ici: http://sourceforge.net/projects/deltasql

deltasql est utilisé de manière productive en Suisse et en Inde, et est populaire au Japon.

1
Tiziano Mengotti

Je suis intéressé par ce sujet aussi.

Il y a quelques discussions sur ce sujet dans le Django wiki .

Il est intéressant de noter que cela ressemble à CakePHP a intégré le contrôle de version du schéma n'utilise que cake schema generate commande.

1
Swaroop C H

Nous exportons les données dans un format portable (à l'aide de notre chaîne d'outils), puis les importons dans un nouveau schéma. pas besoin de delta SQL. Hautement recommandé.

1
Shachar

Pour MySQL

Quand j'atterris sur une nouvelle 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, j'ai pu écrire ce script rapide pour trouver les différences de structure.

src: https://stackoverflow.com/a/8718572/4457531 & https://stackoverflow.com/a/26328331/4457531

Dans un deuxième temps, 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 du travail sûrement

Pour la gestion des versions, j'utilise la même méthode mais je formate un script de mise à jour SQL (pour mettre à niveau ou annuler) avec des résultats différents et j'utilise la convention du numéro de version (avec plusieurs modifications, le numéro de version ressemble à une adresse IP. adresse) .

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------
1
Nolwennig
1
popalka

J'utilise un contrôle de version strict du schéma de base de données (suivi dans un tableau séparé). Les scripts sont stockés dans le contrôle de version, mais ils vérifient tous la version actuelle du schéma avant toute modification.

Voici l'implémentation complète pour SQL Server (la même solution pourrait être développée pour MySQL si nécessaire): Comment gérer la version du schéma de base de données SQL Server

0
Zoran Horvat

Après une longue enquête, j'ai découvert qu'il existait des outils tiers ou des types de projets Visual Studio qui ne me satisfaisaient pas, ou que je ne faisais que des blogs sur la théorie, mais pas d'implémentation. J'ai donc mis en place un système de travail, utilisé presque un an, et expliqué ici:

http://nalgorithm.com/2015/11/09/database-versioning-part-1/

en fonction de l'intérêt, continuera à écrire plus.

0
Yuksel Daskin