PostgreSQL: outil de diff / patch de schéma [fermé]

14

Considérez le paramètre suivant:

  • Une DB de production
  • Une base de données de développement, sur laquelle des modifications de schéma sont apportées pour activer de nouvelles fonctionnalités

Lorsque le développement d'une nouvelle fonctionnalité est terminé, je dois mettre à jour manuellement le schéma prod db jusqu'à ce que pg_dump --schema-onlyles deux bases de données soient identiques. Ce processus est sujet aux erreurs et fastidieux.

Je recherche donc un outil qui peut:

  • Affiche un résumé des différences entre deux schémas (comme diff). Notez que je ne cherche pas un simple diff textuel du schéma, mais un outil plus élaboré qui peut tirer des conclusions comme "Le tableau Xa une nouvelle colonne Y".
  • Générez automatiquement le code SQL qui convertirait un schéma en un autre (comme patch)

Existe-t-il un outil de diff / patch de schéma qui peut m'aider à convertir les schémas de production en schémas de développement plus avancés?

Adam Matan
la source
2
Plutôt que de faire un diff, vous devez gérer vos scripts de migration de manière contrôlée. N'effectuez jamais de modifications DDL ad hoc sur un SGBD, placez toujours la modification dans un script (qui est stocké dans un système de contrôle de version), puis appliquez le script. Rechercher des outils comme Liquibase ou
Flyway
1
@a_horse_with_no_name Merci. Même avec cette approche, un outil diff / patch me faciliterait la vie. BTW, je ne peux pas m'empêcher de fredonner la chanson.
Adam Matan
Vous pouvez essayer pg_comparator: pgfoundry.org/projects/pg-comparator (je ne l'ai jamais utilisé cependant). Liquibase a également un diff intégré et émet les résultats sous la forme d'un ensemble de modifications Liquibase si je ne me trompe pas, ce qui pourrait être un bon point de départ pour une gestion de schéma plus contrôlée
a_horse_with_no_name
Merci. Voulez-vous l'afficher comme réponse pour que je puisse voter?
Adam Matan

Réponses:

11

Désolé de ressusciter une ancienne question

Récemment, j'utilise l' outil de gestion de base de données 0xDBE DataGrip de JetBrains.

Il prend en charge plusieurs moteurs de base de données, dans l'excellent IDE Jetbrains, et une fonctionnalité clé que j'ai trouvée utile est la possibilité de diff2 tables (DEV et PROD).

Ci-dessous, une capture d'écran du diff en action (dans ce cas, il n'y a qu'une seule différence de colonne). La capture d'écran est le résultat du bouton "Fusionner à droite" en haut, générant le SQL requis pour mettre à jour la bonne table.

0xDBE SQL Table Diff

J'espère que ce nouvel outil vous aidera.

Ewan
la source
3
Il n'y a aucun problème à ressusciter de vieilles questions (il y a même des badges à réaliser à partir de cela). Et une question: est-il possible de comparer des bases de données entières (je veux dire, au moins, toutes les tables qu'elles contiennent)?
dezso
@dezso - Merci pour cette assurance. Oui, vous pouvez comparer au niveau de la base de données, du schéma et de la table.
Ewan
1
@BasilBourque - Dans le Databasemenu de gauche , sélectionnez les 2 tableaux que vous souhaitez comparer (avec cmd/ctrl + click), faites un clic droit et sélectionnezCompare
Ewan
3
J'ai récemment rencontré un nouvel outil, écrit en python, migra . Il peut suivre les modifications apportées aux tables, vues, fonctions, index, contraintes, énumérations, séquences et extensions installées et peut également être utilisé comme bibliothèque
scripts
1
@Ewan Aussi, migra suit tout dans les deux bases de données, y compris les déclencheurs et les fonctions. Mais DataGrip ne le fait pas. C'est pourquoi, je déconseille d'utiliser DataGrip comme outil de comparaison. Les inconvénients sont également présents: 1) migra n'est qu'un outil PostgreSQL; 2) migra suit les changements, mais ne produit pas toujours les opérateurs DDL appropriés, comme alter table ... add column, drop column instead of alter table ... rename column etc. Et je n'ai trouvé aucun outil qui produise commandes DDL correctes. Ils ont toujours besoin de polissage. De plus, sans outil de migration, comme Liquibase, toute modification de la base de données sera trop complexe.
Exterminator13
6

Utilisez liquibase .

Elle supporte diff , générer une base de données à partir de zéro, patcher une base de données, restaurer une base de données et un tas d'autres choses.

Avant, vous deviez tout écrire en XML avec la base de données, mais plus maintenant. Vous pouvez en écrire 99% dans le dialecte SQL de votre choix. Exemple:

--liquibase formatted sql

--changeset neil:1 

create table contacts(
  contact_id serial primary key,
  name text not null unique
);

--changeset neil:2
alter table contacts add column phone_num text;

Vous devez conserver vos changelogs de base de données dans git ou what-have-you.

Neil McGuigan
la source
Un problème avec cela est qu'il n'obtient pas correctement les contraintes de commande ou de suppression et les clés primaires.
monksy
2
Flyway est un autre choix similaire à Liquibase.
Basil Bourque