2012-04-05 3 views
7

Ich evaluiere Liquibase und versuche herauszufinden, ob es für Datenmigrationen Vorteile gegenüber SQL-Skripten bietet. Angenommen, ich mache folgendes:Welche Vorteile bietet Liquibase für Datenbankmigrationen?

Meine Version 0 Datenbank-Schema wie folgt aussieht:

CREATE TABLE `Person` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `firstName` varchar(255) NOT NULL, 
    `lastName` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

Die Datenbank ist bevölkert mit einigen vorhandenen Daten durch die folgende, einfügen:

INSERT INTO `Person` (`id`, `firstName`, `lastName`) VALUES (1, 'foo', 'bar'); 

I Entscheiden Sie dann, der Person-Tabelle, die nicht null ist, eine weitere Spalte hinzuzufügen, aber ich möchte keine vorhandenen Daten verlieren. Das Migrationsskript von Version 0 zu Version 1 würde wie folgt aussehen:

ALTER TABLE `Person` ADD COLUMN `dob` date DEFAULT NULL; 

UPDATE `Person` set `dob` = '1970-01-01'; 

ALTER TABLE `Person` MODIFY COLUMN `dob` NOT NULL; 

Könnte Liquibase diesen Anwendungsfall vereinfachen?

Antwort

2

Ich ging vor kurzem die gleiche Sache durch. Siehe: Adding a non-nullable column to existing table fails. Is the "value" attribute being ignored?

Es gibt keine Möglichkeit (in einer einzelnen SQL-Anweisung), eine Spalte mit einem Wert für vorhandene Zeilen hinzuzufügen, ohne dies als Standardwert der Spalte festzulegen. Wenn also die vorhandenen Zeilen einen anderen Wert als neue Zeilen haben sollen (einschließlich wenn Sie keinen Standardwert für die Spalte haben wollen), benötigen Sie mindestens zwei SQL-Anweisungen. Wenn Sie liquibase verwenden, müssen Sie diese Spalte noch in den drei Schritten hinzufügen, die Sie beschreiben.

Also meine Antwort auf Ihre Frage ist: Ja, es gibt Vorteile der Verwendung von Liquibase über nur eine Reihe von SQL-Skripten. Aber das ist keiner von ihnen. :)

+0

Vielen Dank für Ihre Frage/Antwort-Verknüpfung, das hilft. –

+0

Natürlich können Sie eine nicht Null Spalte mit einem Standard in "SQL" hinzufügen. Auf welches DBMS bezieht sich das nicht? –

+0

@a_horse_with_no_name - Sorry, um klar zu sein, meine ich: Es gibt keinen einzigen SQL-Befehl, der eine Nicht-Null-Spalte erstellen kann, die einen Wert für vorhandene Zeilen angibt, aber den Standardspaltenwert nicht festlegt. Ich bin froh darüber, dass ich mich als falsch erwiesen habe, aber ich denke, dass alle Kombinationen von Befehlen, um dies zu erreichen, mindestens 3 Zeilen lang sind. – David

5

Die Hauptsache, die liquibase Ihnen gibt, ist die Fähigkeit zu verfolgen, welche Änderungen auf welche Datenbanken angewendet wurden.

In Ihrem Beispiel wäre die von Ihnen aufgelistete SQL genau das, was liquibase tun würde, aber es wird wissen können, dass Ihre Entwicklungsdatenbank die Version Y hat und wenn Sie Ihre Datenbank "aktualisieren", wird nur ein paar angewendet neue Änderungen, während die Produktion auf Version X ist und wenn Sie die Produktion "aktualisieren", werden mehr Änderungen vorgenommen.

Hinweis: liquibase verfolgt Änderungen unabhängig, anstatt eine einzelne Version zu verwenden, um mehrere Entwickler und/oder Code-Zweige zu unterstützen.

Über die Arbeit der vorgenommenen Änderungen Tracking, Liquibase andere Vorteile, die Sie würde umfassen:

  • Fähigkeit, die gleiche Änderung Beschreibung auf mehrere Datenbanktypen zu haben.
  • Fähigkeit zu haben, wenn/dann Logik in was angewendet wird.
  • Generierte Dokumentation der Datenbankhistorie.
  • Die Fähigkeit, komplexere, mehrfache Statementänderungen einfach zu spezifizieren.
+0

Meinst du "Möglichkeit, dieselbe Änderungsbeschreibung für mehrere Datenbanktypen zu haben"? Was bedeutet das? Warum möchtest du die gleiche Beschreibung haben? –

+0

Zum Beispiel, wenn Ihre Anwendung sowohl MySQL als auch Postgres unterstützt, können Sie einzelne Changelog schreiben, die für beide Datenbanktypen ausgeführt werden können. –

+0

Ah ja, ich denke, das Wort "Beschreibung" warf mich. Ich dachte eher an eine englische Beschreibung der Veränderung als an eine allgemeine. –

0

Mite gibt meiner Meinung nach das Beste aus beiden Welten. Sie können weiterhin Ihre SQL-Scripts verwenden und es verwaltet, ob ein Skript in der Datenbank ausgeführt wurde oder nicht, und Ihnen die gleiche Auf- und Ab-Fähigkeit Ihrer typischen rails-basierten Migration oder Liquibase bietet.

Lassen Sie mich wissen, was Sie denken.

https://github.com/soitgoes/mite