Liquibase: Narzędzie do zarządzania bazami danych

Krzysztof Sedlak

Wstęp

Liquibase to wyjątkowe narzędzie, które rewolucjonizuje sposób zarządzania bazami danych w świecie programowania. Jako otwartoźródłowe oprogramowanie, Liquibase oferuje deweloperom potężne możliwości do śledzenia, zarządzania i wdrażania zmian w bazach danych w sposób kontrolowany i efektywny. W dzisiejszym dynamicznie zmieniającym się środowisku technologicznym, gdzie szybkość i dokładność są kluczowe, Liquibase staje się nieocenionym narzędziem dla zespołów programistycznych na całym świecie.

Początki Liquibase sięgają 2006 roku, kiedy to zostało stworzone przez Nathana Voxlanda. Od tego czasu narzędzie to ewoluowało, stając się jednym z najbardziej zaufanych i szeroko stosowanych rozwiązań w dziedzinie zarządzania bazami danych. Dzięki swojej zdolności do obsługi wielu platform i baz danych, Liquibase zapewnia niezrównaną elastyczność i kompatybilność, co czyni je idealnym wyborem dla różnorodnych projektów i organizacji.

Jedną z głównych zalet Liquibase jest jego podejście oparte na plikach tekstowych do śledzenia zmian w bazie danych. To podejście pozwala na łatwe śledzenie historii zmian, współpracę zespołową oraz integrację z systemami kontroli wersji, takimi jak Git. Przez to Liquibase nie tylko ułatwia zarządzanie bazą danych, ale również wspiera najlepsze praktyki w zakresie DevOps i Continuous Integration/Continuous Deployment (CI/CD).

W tym artykule przyjrzymy się bliżej funkcjonalnościom Liquibase, badając, jak narzędzie to zmienia reguły gry w zarządzaniu bazami danych. Omówimy jego główne cechy, takie jak formaty plików zmian, mechanizmy kontroli wersji i wsparcie dla różnych systemów baz danych. Ponadto przedstawię przykład użycia, demonstrując, jak Liquibase może być wykorzystane do poprawy efektywności i dokładności w zarządzaniu zmianami w bazie danych.

Kluczowe Cechy Liquibase:

  1. Formaty Plików Zmian: Liquibase pozwala definiować zmiany w bazie danych za pomocą różnych formatów plików, w tym XML, YAML, JSON, i SQL. Umożliwia to użytkownikom wybór formatu, który najlepiej pasuje do ich projektu i umiejętności.
  2. Niezależność od Platformy: Działa na różnych systemach operacyjnych i jest kompatybilne z wieloma systemami zarządzania bazami danych, co czyni je uniwersalnym narzędziem.
  3. Śledzenie Zmian: Liquibase śledzi zmiany w bazie danych w sposób kontrolowany, zapewniając pełną historię i audyt zmian.
  4. Integracja z Narzędziami CI/CD: Łatwo integruje się z popularnymi narzędziami Continuous Integration i Continuous Deployment, takimi jak Jenkins, Bamboo, czy TeamCity.
  5. Rollbacks: Możliwość łatwego cofania zmian (rollbacks) w bazie danych, co jest kluczowe przy wystąpieniu błędów lub konieczności przywrócenia poprzednich stanów.
  6. Wsparcie Społeczności i Rozszerzalność: Mając szeroką społeczność użytkowników i deweloperów, Liquibase jest ciągle rozwijane i dostosowywane do nowych potrzeb.
  7. Kontrola Wersji: Zmiany w bazie danych mogą być wersjonowane, co umożliwia lepszą organizację i kontrolę nad procesem rozwoju.

Zalety Liquibase:

  1. Ułatwia Zarządzanie Zmianami: Umożliwia łatwe zarządzanie, śledzenie i wdrażanie zmian w schematach baz danych, co jest kluczowe w dynamicznych środowiskach rozwoju oprogramowania.
  2. Poprawa Współpracy: Ułatwia współpracę między zespołami dzięki zastosowaniu standardowych formatów plików i integracji z narzędziami kontroli wersji.
  3. Zwiększa Efektywność: Automatyzacja procesów związanych ze zmianami w bazie danych znacząco zwiększa efektywność pracy zespołów deweloperskich.
  4. Zmniejsza Ryzyko Błędów: Automatyczne śledzenie zmian i możliwość testowania zmian przed ich wdrożeniem minimalizuje ryzyko błędów.
  5. Elastyczność: Możliwość dostosowania do różnych środowisk i potrzeb projektowych.
  6. Wsparcie dla Wielu Baz Danych: Możliwość pracy z różnymi systemami baz danych zwiększa uniwersalność narzędzia. Wspierane bazy danych

Instalacja i konfiguracja

Aby, zacząć korzystać z Liquibase, należy pobrać odpowiednią wersję, korzystając ze strony projektu

Po poprawnej instalacji powinniśmy móć wykonać następujące polecenie w naszej konsoli:

liquiCommandVpng

Jeżeli wszystko zostało zainstalowane pomyślnie, powinniśmy ujrzeć szczegóły naszej instalacji.

Teraz, aby stworzyć jakąś strukturę bazy danych, możemy przygotować pliki z instrukcjami. Pliki te, jak zostało już wspomniane, mogą być przygotowane w formatach SQL, XML, YAML, lub JSON. Ja w swoim przykładzie posłużę się plikami YAML.

Na potrzeby prezentacji stworzyłem 4 pliki, jeden zawierający instrukcję stworzenia dwóch tabel, następne dodające index i kolumnę oraz plik główny z definicją jakie pliki, powinny zostać uruchomione:

filesStructure.png

Plik:001_table_creation.yaml

Jak możemy zauważyć, plik yaml zawiera definicję poszczególnych kolumn i tabel, w bardzo czytelnej postaci. Dodałem również do łatwiejszego nawigowania tagi, oznaczając wersję naszej bazy. Mamy tutaj również zdefiniowane działanie w razie wystąpienia błędów w ramach Preconditions. Na samym końcu w ramach dobrej praktyki jest zdefiniowana część rollback będącą instrukcją jak cofnąć zmiany wprowadzane w danym pliku.

Plik: 002_addIndex.yaml

Plik: 003_addColumn.yaml

A także plik master.yaml gdzie znajduje się definicja, tego jakie, pliki w i w jakiej kolejności powinny być aplikowane, aby utworzyć pożądaną strukturę danych.

Praca z liquibase

Poniżej postaram się przedstawić najważniejsze z komend pozwalające na rozpoczęcie pracy z tym narzędziem. Natomiast pełną listę komend możemy znaleźć w dokumentacji, która zawiera wiele szczegółowych informacji na temat ich użycia.

Za pomocą komendy:

Możemy stworzyć domyślną konfigurację bazy h2

A teraz za pomocą komendy:

Wystartujemy bazę danych H2, po czym powinna się otworzyć jej konsola. Następnie przechodząc do lokalizacji moich plików, mogę wykonać polecenie:

Komenda ta wypisała mi komendy SQL do weryfikacji jakie zostaną odpalone przy operacji update. Możemy zatem je zweryfikować czy aby na pewno nie ma tam czegoś czego byśmy nie chcieli wykonać. Przed wykonaniem operacji update, możemy również wykonać operację validate, która może wykryć potencjalne problemy.

I jak widać poniżej, żadne z potencjalnych błędów nie zostały wykryte.

Zatem za pomocą komendy update zaaplikuje nasze zmiany.

Jak widać nasze tabele zostały utworzone 

tablesCreated.png)

 Oprócz naszych tabel ADDRESS i COMPANIES, zostały utworzone tabele pomocnicze Liquibase DATABASECHANGELOGLOCK gdzie przechowywana jest informacja o zablokowaniu bazy oraz DATABASECHANGELOG zawierająca historię zmian: 

changelog.png

Możemy również sprawdzić poleceniem status czy nasza baza jest aktualna z danym plikiem:

Teraz załóżmy, że ostatnia wprowadzona zmiana spowodowała problemy i chcemy cofnąć dodanie kolumny 'TaxNumber’, która jak widzimy jest w strukturze: 

structure.png

W tym celu wykonam polecenie, które cofnie nam bazę danych do konkretnej wersji.

Co jak widzimy poniżej, zmodyfikowało nasz changelog, a także kolumna dodawana w wersji 1.0.3 już jest nieobecna.

removedColumn

Przedstawiłem tutaj naprawdę bardzo prosty przypadek wycofania zmian. Liquibase to jednak bardzo potężne narzędzie i celem artykułu jest jego krótkie przedstawienie, które mam nadzieje, zachęci do dalszego zagłębienia się w jego możliwościach. Dlatego odsyłam do zapoznania się z poszczególnymi opcjami w dokumentacji, gdyż może to być narzędzie warte wdrożenia w wielu projektach.

Integracja ze spring-boot

Liquibase może również zostać dołączony jako dependencja do naszego projektu i zintegrowany z naszą aplikacją korzystającą ze SpringBoot’a.

W celu zademonstrowania tego skorzystam tutaj również z prostej bazy H2 i zainicjalizuję projekt za https://start.spring.io/![SpringInitializer.png]

SpringInitializer.png

Jeżeli chcemy tylko dodać zależność do pom’a:

Następnie w moim application.yaml oprócz konfiguracji bazy H2, wskazuje właściwość liquibase.change-log, określając lokalizacje, mojego pliku master.yaml

Przy takiej konfiguracji liquibase zainicjuje strukturę danych przy starcie aplikacji, jak widać na poniższym logu.

Podsumowanie

Podsumowując, Liquibase stanowi rewolucyjne narzędzie w świecie zarządzania bazami danych, oferując rozwiązanie do efektywnego, kontrolowanego i zautomatyzowanego wprowadzania zmian w bazach danych. Jego uniwersalność, widoczna w wsparciu dla różnorodnych formatów plików zmian, a także niezależność od platformy i rozwiązań bazodanowych, sprawia, że jest ono niezastąpione w różnorodnych środowiskach deweloperskich.

Kluczowe cechy Liquibase, takie jak integracja z narzędziami CI/CD, możliwość cofania zmian, a także wsparcie społeczności, czynią to narzędzie nie tylko wszechstronnym, ale i elastycznym, dostosowującym się do zmieniających się potrzeb i wyzwań współczesnego programowania. Poprzez ułatwienie współpracy między zespołami oraz poprawę efektywności i dokładności w zarządzaniu zmianami, Liquibase znacząco przyczynia się do zwiększenia produktywności i minimalizacji ryzyka błędów w projektach.

W tym artykule przybliżyliśmy, jak Liquibase rewolucjonizuje procesy zarządzania bazami danych, podkreślając jego rolę w wspieraniu najlepszych praktyk w dziedzinie DevOps i CI/CD. W dobie ciągłych zmian i rosnącej złożoności systemów informatycznych, Liquibase jawi się jako kluczowy element w arsenale każdego programisty i zespołu IT, który aspiruje do efektywności, skalowalności i niezawodności w swoich przedsięwzięciach programistycznych.

Bibliografia

  • https://www.liquibase.org/

Poznaj mageek of j‑labs i daj się zadziwić, jak może wyglądać praca z j‑People!

Skontaktuj się z nami