PostgreSQL: Schema Diff / Patch Tool [geschlossen]

13

Betrachten Sie die folgende Einstellung:

  • Eine Produktions-DB
  • Eine dev db, an der Schemaänderungen vorgenommen werden, um neue Funktionen zu aktivieren

Wenn die Entwicklung eines neuen Features abgeschlossen ist, muss das prod db-Schema manuell aktualisiert werden, bis es pg_dump --schema-onlyauf beiden DBs identisch ist. Dieser Vorgang ist fehleranfällig und mühsam.

Daher suche ich ein Tool, das Folgendes kann:

  • Zeigen Sie eine Zusammenfassung der Unterschiede zwischen zwei Schemas (wie diff). Beachten Sie, dass ich nicht nur nach einem textuellen Unterschied des Schemas suche, sondern nach einem ausgefeilteren Tool, das Schlussfolgerungen wie "Tabelle Xhat eine neue Spalte Y" ziehen kann.
  • Generieren Sie automatisch den SQL-Code, der ein Schema in ein anderes konvertiert (wie patch)

Gibt es ein Schema- Diff / Patch- Tool, mit dem ich Produktschemata in die fortgeschritteneren Dev-Schemata konvertieren kann?

Adam Matan
quelle
2
Anstatt ein Diff durchzuführen, sollten Sie Ihre Migrationsskripten kontrolliert verwalten. Nehmen Sie niemals Ad-hoc-DDL-Änderungen an einem DBMS vor, schreiben Sie die Änderungen immer in ein Skript (das in einem Versionskontrollsystem gespeichert ist) und wenden Sie das Skript dann an. Schauen Sie sich Tools wie Liquibase oder Flyway an
a_horse_with_no_name
1
@a_horse_with_no_name Danke. Selbst mit diesem Ansatz würde ein Diff / Patch-Tool mein Leben leichter machen. Übrigens, ich kann nicht anders, als das Lied zu summen.
Adam Matan
Sie könnten es mit pg_comparator versuchen: pgfoundry.org/projects/pg-comparator (ich habe es aber noch nie benutzt). Liquibase verfügt auch über ein integriertes Diff und gibt die Ergebnisse als Liquibase-Änderungssatz aus, wenn ich mich nicht irre. Dies könnte ein guter Ausgangspunkt für ein kontrolliertes Schema-Management sein
a_horse_with_no_name
Vielen Dank. Möchtest du es als Antwort posten, damit ich dich unterstützen kann?
Adam Matan

Antworten:

11

Tut mir leid, eine alte Frage wiederzubeleben

Vor kurzem habe ich das 0xDBE DataGrip- Datenbankverwaltungstool von JetBrains verwendet.

Es unterstützt mehrere Datenbank-Engines in der hervorragenden Jetbrains-IDE. Eine meiner wichtigsten Funktionen ist die Möglichkeit, diffzwei Tabellen (DEV und PROD) zu erstellen.

Unten ist ein Screenshot des Unterschieds in Aktion (in diesem Fall gibt es nur einen Spaltenunterschied). Der Screenshot ist das Ergebnis der Schaltfläche "Rechts zusammenführen" oben, mit der die SQL generiert wird, die erforderlich ist, um die richtige Tabelle auf den neuesten Stand zu bringen.

0xDBE SQL Table Diff

Hoffe, dieses neue Tool hilft.

Ewan
quelle
3
Es ist kein Problem, alte Fragen wiederzubeleben (es gibt sogar Abzeichen, die man daraus ziehen kann). Und eine Frage: Ist es möglich, ganze Datenbanken zu vergleichen (ich meine zumindest alle Tabellen in ihnen)?
Dezso
@dezso - Danke für die Bestätigung. Ja, Sie können auf Datenbank-, Schema- und Tabellenebene vergleichen.
Ewan
Wie initiiert man die Diff-Funktion in 0xDBE? Ich kann keinen Menüeintrag für ein Diff-Tool finden.
Basil Bourque
1
@BasilBourque - Wählen Sie im DatabaseMenü auf der linken Seite die 2 Tabellen aus, mit denen Sie vergleichen möchten (mit der cmd/ctrl + clickrechten Maustaste ), und wählen SieCompare
Ewan
2
Ich bin vor kurzem auf ein neues Tool gestoßen , das in Python, Migra , geschrieben ist . Es kann Änderungen Änderungen an Tabellen, Views, Funktionen, Indizes, Einschränkungen, Aufzählungen, Sequenzen und installierten Erweiterungen verfolgen und auch als Bibliothek genutzt werden kann
Skripte
6

Verwenden Sie Liquibase .

Es unterstützt Diff , generiert eine Datenbank von Grund auf neu, repariert eine Datenbank, setzt eine Datenbank zurück und eine Reihe anderer Dinge.

Früher musste man mit liquibase alles in XML schreiben, aber nicht mehr. Sie können 99% davon in den SQL-Dialekt Ihrer Wahl schreiben. Beispiel:

--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;

Sie sollten Ihre Liquibase-Änderungsprotokolle in Git oder What-Have-You aufbewahren.

Neil McGuigan
quelle
Ein Problem dabei ist, dass das Ordnen oder Entfernen von Einschränkungen und Primärschlüsseln nicht richtig funktioniert.
monksy
2
Flyway ist eine andere Wahl, die Liquibase ähnlich ist.
Basil Bourque