4. Problem
• Baza danych musi być integralna podczas
developmentu.
• Jak utrzymać jej integralność?
• Jak pozbyć się problemu supportowania
developerów?
• Problem branchowania i mergeowania zmian
wprowadzanych podczas równoległego rozwoju
aplikacji.
5. Czym jest Liquibase?
•
•
•
•
Niezależna od bazy danych biblioteka.
OpenSource.
Dostępna z linii poleceń.
Do śledzenia i zarządzania zmianami w bazie
danych.
• Zmiany są zapisywane w plikach XML.
7. Format zmian
•
•
•
•
Jako plik XML
Obsługuje ponad 40 rodzajów zmian
W tym raw SQL, co jest otwartą furktą
Można uruchamiać komendy shell
http://www.liquibase.org/manual/refactoring_commands
11. Uruchamianie Liquibase
Możliwość uruchomienia Liquibase z poziomu:
•
•
•
•
•
•
•
Ant
Maven
Spring Framework (jako bean w kontekście)
Grails
Servlet Listener
Command Line
Integracja z Hibernate
13. Instalacja
4. W bieżącym katalogu tworzymy pusty
liquibase.properties z wpisem:
classpath=D:ProgramsLiquibase
postgresql-9.1-902.jdbc4.jar
Nadpisuje on wartości z linii poleceń, można
zmienić lokalizację za pomocą flagi -defaultsFile
http://www.liquibase.org/manual/command_line#using_a_li
quibaseproperties_file
14. Wymagania
1. Java 1.5 lub nowsza
2. Poprawnie skonfigurowany classpath oraz
JAVA_HOME
3. Tak, aby Java była dostępna z polecenia:
java -version
4. Liquibase jest uruchamiane jako archiwum
JAR:
java -jar liquibase.jar
16. Pierwszy zrzut bazy danych
liquibase
--url=jdbc:postgresql://localhost:5432/
handlowcy
--username postgres
--password root
--changeLogFile="schema.xml"
generateChangeLog
http://www.liquibase.org/manual/generating_changelogs
17.
18. Pierwszy zrzut bazy danych
Ograniczenia, w sposób automatyczny nie są
zrzucane:
• Procedury składowane
• Funkcje
• Triggey
• Jest możliwość wykonywania swoich zapytań
SQL, ale nie będą przenośne.
http://www.liquibase.org/manual/generating_changelogs
26. Nadeszły zmiany, diff
Diff nie obsługuje:
• Non-foreign key constraints (check, etc)
• Stored Procedures
• Data type length*
* Testowano: Zmiany długości varchar w
PostgreSQL są wykrywane.
27. Nadeszły zmiany, diff
• Ważnym jest, żeby dobrze interpretować „reference”.
Z naszej perspektywy baza produkcyjna jest główną, a
rererence jest developerska.
Jeżeli odwrócimy, naturalną konsekwencją jest
wygenerowanie DROP’ów zamiast CREATE’ów.
• Umieszczanie daty i nazwy dewelopera w nazwach
plików changelogów to dobry nawyk:
2012-11-24-athlan.xml.
• Przy zbiorczych change’ach pliki te jednoznacznie są
identyfikowane nie tylko w Liquibase, ale na
repozytorium git czy SVN, można je łatwiej mergeować.
28. Nadeszły zmiany, diff
• Raz wykonany changeSet już nigdy nie zostanie
powtórzony (identyfikowany po author oraz id).
• Nie ma poprawiania XML na repo.
29. Tagowanie bazy danych
1. W pliku XML
<tagDatabase tag="NAZWA"/>
2. Z poziomu linii poleceń
liquibase
--url=jdbc:postgresql://…
--username postgres
--password root
tag NAZWA
32. Rollback
• Większość operacji ma komplementarne sobie
operacje odwrotne.
• Jeżeli nie mają, lub chcemy podjąć inne akcje,
do changeset’a dodajemy tag <rollback>
• Są zapisywane w bazie danych.
35. Preconditions
Warunki, które muszą być spełnione, aby nastąpił
cały zestaw changeset’ów lub pojedynczy z nich.
Przydają się, gdy:
• Osoba przygotowująca changelog ma jakieś
założenia.
• Zapewnia ich przestrzealność.
• Umożliwia sprawdzenie danch, bądź
parametrów.
• Decyduje, które chengesety są uruchamiane, a
które nie.