2012-04-05 5 views
7

Oceniam Liquibase i próbuję dowiedzieć się, czy ma jakieś zalety migracji danych za pomocą tylko skryptów SQL. Załóżmy, że mam następujący sposób:Jakieś korzyści z używania Liquibase do migracji baz danych?

Moja wersja 0 schematu bazy danych wygląda następująco:

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

Baza jest wypełniana niektórych istniejących danych reprezentowanych przez następujące wkładki:

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

I następnie zdecyduj się dodać kolejną kolumnę do tabeli Person, która nie jest pusta, ale nie chcę stracić żadnych istniejących danych. Skrypt migracji z wersji 0 do wersji 1 będzie wyglądał następująco:

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

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

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

Czy Liquibase może ułatwić to użycie?

Odpowiedz

2

Przeszedłem ostatnio to samo. Zobacz: Adding a non-nullable column to existing table fails. Is the "value" attribute being ignored?

Nie ma sposobu (w pojedynczej instrukcji SQL), aby dodać kolumnę z wartością dla istniejących wierszy bez ustawiania jako domyślnej wartości kolumny. Jeśli chcesz, aby istniejące wiersze miały inną wartość niż dodane nowe wiersze (w tym, jeśli w ogóle nie chcesz wartości domyślnej w kolumnie), potrzebujesz co najmniej dwóch instrukcji SQL. Tak więc używając metody typu liquibase, nadal musisz dodać tę kolumnę w trzech opisanych krokach.

Tak więc moja odpowiedź na twoje pytanie brzmi: Tak, istnieją zalety korzystania z Lunibase po tylko utrzymaniu serii skryptów SQL. Ale to nie jest jedna z nich. :)

+0

Dziękuję za link do pytania/odpowiedzi, która pomaga. –

+0

Oczywiście można dodać kolumnę niezerową z domyślną wartością "SQL". Którego DBMS, do którego się odnosisz, nie obsługuje tego? –

+0

@a_horse_with_no_name - Przepraszamy, aby było jasne Mam na myśli: Nie ma pojedynczego polecenia SQL, które może utworzyć kolumnę o wartości niezerowej, która określa wartość dla istniejących wierszy, ale która nie ustawia domyślnej wartości kolumny. Cieszę się, że się nie mylę, ale wydaje mi się, że wszystkie kombinacje poleceń do osiągnięcia tego mają co najmniej 3 linie. – David

5

Najważniejszą rzeczą, jaką daje płynność, jest możliwość śledzenia, jakie zmiany zostały zastosowane w bazach danych.

W twoim przykładzie, SQL, który wpisujesz, będzie dokładnie tym, co zrobi liquibase, ale będzie mógł wiedzieć, że twoja baza danych dev znajduje się w wersji Y, a kiedy "zaktualizujesz" swoją bazę danych, zastosuje tylko parę nowe zmiany, podczas gdy produkcja dotyczy wersji X, a kiedy "zaktualizujesz" produkcję, wprowadzi więcej zmian.

Uwaga: tory typu liquibase zmieniają się niezależnie, zamiast używać jednej wersji do obsługi wielu programistów i/lub gałęzi kodu.

Poza pracą śledzenia zastosowane zmiany, inne zalety liquibase nie daje to:

  • zdolność do tego samego opisu zmiany na wielu rodzajów baz danych.
  • Możliwość posiadania logiki w tym, co jest stosowane.
  • Wygenerowano dokumentację historii bazy danych.
  • Zdolność do łatwego określania bardziej złożonych, wielowyrazowych zmian.
+0

Czy masz na myśli "Możliwość posiadania tego samego opisu zmian dla wielu typów baz danych"? Co to znaczy? Dlaczego chcesz mieć ten sam opis? –

+0

Na przykład, jeśli twoja aplikacja obsługuje zarówno MySQL, jak i PostgreSQL, możesz napisać jeden dziennik zmian, który może być wykonany na obu typach baz danych. –

+0

Ach tak, myślę, że słowo "opis" rzuciło mnie. Miałem na myśli angielski opis zmiany, a nie ogólny. –

0

Roztocze daje najlepsze z obu światów, moim zdaniem. Możesz nadal korzystać ze skryptów sql i zarządza to, czy skrypt został wykonany w bazie danych, czy nie, i daje tę samą możliwość zwiększania i zmniejszania typowej migracji opartej na szynach lub Liquibase.

Daj mi znać, co myślisz.

https://github.com/soitgoes/mite