327 Stimmen

Wie kann ich eine Datenbank unter Git (Versionskontrolle) stellen?

Ich tue eine Webanwendung, und ich muss einen Zweig für einige wichtige Änderungen zu machen, die Sache ist, diese Änderungen erfordern Änderungen an der Datenbank-Schema, so möchte ich die gesamte Datenbank unter Git als auch setzen.

Wie mache ich das? Gibt es einen bestimmten Ordner, den ich unter einem Git-Repository behalten kann? Woher weiß ich, welcher es ist? Wie kann ich sicher sein, dass ich den richtigen Ordner verwende?

Ich muss sicher sein, denn diese Änderungen sind nicht abwärtskompatibel; ich kann es mir nicht leisten, einen Fehler zu machen.

Die Datenbank ist in meinem Fall PostgreSQL

Bearbeiten:

Jemand schlug vor, Sicherungskopien zu erstellen und die Sicherungsdatei statt der Datenbank unter Versionskontrolle zu stellen. Um ehrlich zu sein, finde ich das wirklich schwer zu schlucken.

Es muss doch einen besseren Weg geben.

Aktualisierung:

OK, es gibt also keinen besseren Weg, aber ich bin immer noch nicht ganz überzeugt, also werde ich die Frage etwas abändern:

Ich möchte die gesamte Datenbank unter Versionskontrolle stellen. Welche Datenbank-Engine kann ich verwenden, damit ich die eigentliche Datenbank unter Versionskontrolle stellen kann, anstatt ihren Dump?

Wäre Sqlite git-freundlich?

Da dies nur die Entwicklungsumgebung ist, kann ich jede beliebige Datenbank wählen.

Bearbeiten2:

Was ich wirklich möchte, ist nicht meine Entwicklungsgeschichte zu verfolgen, sondern in der Lage sein, von meinem "neuen radikalen Änderungen" Zweig auf den "aktuellen stabilen Zweig" zu wechseln und in der Lage sein, zum Beispiel einige Bugs/Probleme, etc, mit dem aktuellen stabilen Zweig zu beheben. Wenn ich also den Zweig wechsle, wird die Datenbank automatisch mit dem Zweig kompatibel, in dem ich mich gerade befinde. Die eigentlichen Daten sind mir eigentlich ziemlich egal.

163voto

X-Istence Punkte 15834

Machen Sie einen Datenbank-Dump und führen Sie stattdessen eine Versionskontrolle durch. Auf diese Weise ist es eine flache Textdatei.

Ich persönlich schlage vor, dass Sie sowohl einen Datendump als auch einen Schema-Dump aufbewahren. Auf diese Weise kann man mit diff recht einfach feststellen, was sich im Schema von Revision zu Revision geändert hat.

Wenn Sie große Änderungen vornehmen, sollten Sie eine sekundäre Datenbank haben, in der Sie die neuen Schemaänderungen vornehmen und die alte nicht anfassen, da Sie, wie Sie sagten, eine Verzweigung erstellen.

31voto

hasen Punkte 154413

Ich fange an, über eine wirklich einfache Lösung nachzudenken, ich weiß nicht, warum ich nicht schon früher darauf gekommen bin!!!

  • Duplizieren Sie die Datenbank (sowohl das Schema als auch die Daten).
  • Ändern Sie im Zweig für die neuen Hauptänderungen einfach die Projektkonfiguration, um die neue doppelte Datenbank zu verwenden.

Auf diese Weise kann ich zwischen den Zweigen wechseln, ohne mich um Änderungen am Datenbankschema kümmern zu müssen.

EDIT :

Mit duplizieren meine ich, eine weitere Datenbank mit einem anderen Namen zu erstellen (wie my_db_2 ); ich mache keinen Dump oder so etwas.

25voto

Tails Punkte 534
  • Irmin (Verzweigung + Zeitreise)
  • Flur.ee (unveränderlich + Zeitreise + Graphabfrage)
  • Crux DB (Zeitreise + Abfrage)
  • TerminusDB (unveränderlich + Verzweigung + Zeitreise + Graph Query!)
  • DoltDB (Verzweigung + Zeitreise + SQL-Abfrage)
  • Quadrable (Verzweigung + Fernüberprüfung des Zustands)
  • EdgeDB (keine echte Zeitreise, sondern vom Compiler abgeleitete Migrationen nach Schemaänderungen)
  • Migra (Diffing für Postgres-Schemata/Daten. Automatische Generierung von Migrationsskripten, automatische Synchronisierung des Datenbankstatus)
  • ImmuDB (unveränderlich + Zeitreise)

21voto

zie Punkte 692

Verwenden Sie etwas wie LiquiBase Damit können Sie die Revisionskontrolle über Ihre Liquibase-Dateien behalten. Sie können Änderungen nur für die Produktion kennzeichnen, und lb hält Ihre DB entweder für die Produktion oder für die Entwicklung auf dem neuesten Stand (oder nach welchem Schema Sie wollen).

8voto

sibaz Punkte 1132

Ich bin auf diese Frage gestoßen, da ich ein ähnliches Problem habe, bei dem etwas, das einer DB-basierten Verzeichnisstruktur ähnelt, "Dateien" speichert, und ich brauche Git, um es zu verwalten. Es ist verteilt, über eine Wolke, mit Replikation, daher wird es Zugriffspunkt über MySQL sein.

Der Kern der obigen Antworten scheint in ähnlicher Weise eine alternative Lösung für das gestellte Problem vorzuschlagen, was irgendwie am Thema vorbeigeht, nämlich Git zu verwenden, um etwas in einer Datenbank zu verwalten, also werde ich versuchen, diese Frage zu beantworten.

Git ist ein System, das im Wesentlichen eine Datenbank von Deltas (Unterschieden) speichert, die wieder zusammengesetzt werden können, um einen Kontext zu reproduzieren. Bei der normalen Verwendung von Git wird davon ausgegangen, dass der Kontext ein Dateisystem ist und diese Deltas Diffs in diesem Dateisystem sind, aber in Wirklichkeit ist Git nichts anderes als eine hierarchische Datenbank von Deltas (hierarchisch, weil in den meisten Fällen jedes Delta ein Commit mit mindestens einem Elternteil ist, angeordnet in einem Baum).

Solange Sie ein Delta erzeugen können, kann Git es theoretisch auch speichern. Das Problem ist, dass Git normalerweise erwartet, dass der Kontext, in dem es Deltas erzeugt, ein Dateisystem ist, und wenn Sie einen Punkt in der Git-Hierarchie auschecken, erwartet es, dass es ein Dateisystem erzeugt.

Wenn Sie Änderungen in einer Datenbank verwalten wollen, haben Sie 2 getrennte Probleme, die ich an Ihrer Stelle getrennt angehen würde. Das erste ist das Schema, das zweite sind die Daten (obwohl Sie in Ihrer Frage angeben, dass Sie sich nicht um die Daten kümmern). Ein Problem, das ich in der Vergangenheit hatte, war eine Entwicklungs- und eine Produktionsdatenbank, in der die Entwicklungsabteilung inkrementelle Änderungen am Schema vornehmen konnte, und diese Änderungen mussten im CVS dokumentiert und zusammen mit Ergänzungen zu einer von mehreren "statischen" Tabellen in den Echtbetrieb übertragen werden. Dazu hatten wir eine dritte Datenbank, Cruise genannt, die nur die statischen Daten enthielt. Zu jedem beliebigen Zeitpunkt konnten die Schemata von Dev und Cruise verglichen werden, und wir verfügten über ein Skript, das den Unterschied zwischen diesen beiden Dateien aufnahm und eine SQL-Datei mit ALTER-Anweisungen erstellte, um sie anzuwenden. Ebenso konnten alle neuen Daten in eine SQL-Datei mit INSERT-Befehlen destilliert werden. Solange Felder und Tabellen nur hinzugefügt, aber nicht gelöscht werden, könnte der Prozess die SQL-Anweisungen zur Anwendung des Deltas automatisieren.

Der Mechanismus, mit dem Git Deltas erzeugt, ist diff und der Mechanismus, mit dem es 1 oder mehrere Deltas mit einer Datei kombiniert, heißt merge . Wenn Sie eine Methode zum Diffing und Merging aus einem anderen Kontext heraus entwickeln können, sollte git funktionieren, aber wie bereits erwähnt, bevorzugen Sie vielleicht ein Tool, das dies für Sie erledigt. Mein erster Gedanke zur Lösung dieses Problems ist dieser https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#External-Merge-and-Diff-Tools in dem beschrieben wird, wie man das interne Diff- und Merge-Werkzeug von Git ersetzt. Ich werde diese Antwort aktualisieren, wenn mir eine bessere Lösung für das Problem einfällt, aber in meinem Fall erwarte ich, dass ich nur Datenänderungen verwalten muss, insofern sich ein DB-basierter Dateispeicher ändern kann, also ist meine Lösung vielleicht nicht genau das, was Sie brauchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X