Prezentacja powstała na potrzeby prezentacji JUG Bielsko-Biała.
Na początku zaczynamy od postawienia sobie pytania dlaczego liquibase jest nam potrzebny i z jakimi problemami spotykamy się na co dzień podczas zarządzania schematem relacyjnej bazy danych.
W kolejnej części prezentacji odpowiadamy sobie na zadane pytania zgłębiając wiedzę o liquibase
Do prezentacji dołączony jest demo: https://github.com/mlubanski/questionnarie-server
1. Liquibase w praktyce
Mateusz Lubański
JUG Bielsko-Biała
1 września 2016
Mateusz Lubański Liquibase w praktyce 1 września 2016 1 / 30
2. O mnie
Java Developer 5+
Technologie backendowe
Obecnie pracuje w Omnetric
Fan Agile i Scrum
Hobby: narty/kajaki/trekking//salsa
http://linkedin.com/in/mateuszlubanski
Mateusz Lubański Liquibase w praktyce 1 września 2016 2 / 30
3. Podstawowe problemy w zarządzaniu bazą
śledzenie zmian
dane słownikowe
dane testowe
automatyzacja
wersjonowanie
niezależny od środowiska
łatwy
Mateusz Lubański Liquibase w praktyce 1 września 2016 3 / 30
10. Pierwszy changeSet
sql
<changeSet id=”1” author=”mlubanski”>
<sqlFile relativeToChangelogFile=”true” path=”sql/create person.sql”/>
</changeSet>
CREATE TABLE person
(
id serial NOT NULL,
name character varying(100) NOT NULL,
date date DEFAULT now(),
CONSTRAINT pk person PRIMARY KEY (id),
CONSTRAINT person name key UNIQUE (name)
);
xml
<changeSet id=”2” author=”mlubanski”>
<createTable tableName=”USER”>
<column name=”ID” type=”int” autoIncrement=”true” >
<constraints primaryKey=”true” nullable=”false” />
</column>
<column name=”NAME” type=”varchar(100)” >
<constraints nullable=”false” unique=”true”/>
</column>
<column name=”DATE” type=”date” defaultValueComputed=”now()”>
<constraints nullable=”false” />
</column>
</createTable>
</changeSet>
Mateusz Lubański Liquibase w praktyce 1 września 2016 10 / 30
11. Skąd Liquibase wie który skrypt został już wykonany?
id musi być unikalne dla changeLog’a i użytkownika
Liquibase generuje i zapisuje md5sum dla każdego wykonanego
changeSet’a
Główna idea liquibase’a to ciągła liniowa sekwencja zmian na bazie
danych. Podobnie jak przy Versioning Control System nie
modyfikujemy starych commit’ów tak przy liquibas’e nie
modyfikujemy starych changeSet’ów ponieważ możemy zerwać
spójność bazy danych.
Mateusz Lubański Liquibase w praktyce 1 września 2016 11 / 30
12. Skąd Liquibase wie który skrypt został już wykonany?
DATABASECHANGELOGLOCK (liquibase releaseLocks)
LOCKED
LOCKGRANTED
LOCKEDBY
DATABASECHANGELOG
ID
AUTHOR
FILENAME
DATEEXECUTED
EXECTYPE [EXECUTED, FAILED, SKIPPED, RERAN, MARKRAN]
MD5SUM
DESCRIPTION
Mateusz Lubański Liquibase w praktyce 1 września 2016 12 / 30
13. Wspierane Refactorings
create: table, view, procedure, sequence, index
add: column, foreign key, not null, unique, default value, primary key,
autoincrement
drop: ...
rename: column, table, view,
others: insert, load data, sql, sqlFile, modify data type, update
Mateusz Lubański Liquibase w praktyce 1 września 2016 13 / 30
22. Przykładowa struktura
dbchangelogdb.changelog.dev.xml
<property name=”key.type” value=”NUMERIC(10,0)” />
<property name=”name.type” value=”VARCHAR(255)”/>
...
<include file=”R1/db.changelog.master.xml” relativeToChangelogFile=”true” />
<include file=”R2/db.changelog.master.xml” relativeToChangelogFile=”true” />
dbchangelogR1db.changelog.master.xml
<include file=”db.changelog.2016−08.20.xml” relativeToChangelogFile=”true” />
<include file=”db.changelog.2016−08.20.xml” relativeToChangelogFile=”true” />
Mateusz Lubański Liquibase w praktyce 1 września 2016 22 / 30
23. Jak wdrożyć liquibase do istniejącego projektu
1 Generujemy changeLog’a (komenda ta nie eksportuje: Stored
procedures, functions, packages, Triggers)
java −jar ./liquibase−core−3.5.1.jar
db.changelog.xml
generateChangeLog
2 Odpalamy changelogSync który wypełnia nam tabelę
DATABASECHANGELOG wpisami z changeSet’ów bez wykonywania
ich na bazie
java −jar ./liquibase−core−3.5.1.jar
db.changelog.xml
changeLogSync
Mateusz Lubański Liquibase w praktyce 1 września 2016 23 / 30
24. Przydatne triki
Co gdy admin na powie, że on musi mieć SQL’a? :)
java −jar ./liquibase−core−3.5.1.jar
src/main/resources/db/changelog/db.changelog−master.xml
updateSQL > /tmp/script.sql
Czy na pewno baza A jest taka sama jak baza B?
java −jar ./liquibase−core−3.5.1.jar
diffChangeLog
−−referenceUrl=”jdbc:postgresql://localhost:5432/B”
−−referenceUsername=sample
−−referencePassword=topsecret
> diff.database.changelog.xml
Diff Nie wspiera: Non-foreign key constraints (check, etc), Stored
Procedures, Data type length
Mateusz Lubański Liquibase w praktyce 1 września 2016 24 / 30
26. Podsumowanie
śledzenie zmian - spersonalizowane changeSet’y zapisywane w bazie
wraz z dbDoc
dane słownikowe - loadData + .csv
dane testowe - contexts
automatyzacja - libuibase:update
wersjonowanie - include + odpowiednia struktura
niezależny od środowiska - xml
łatwy - umiarkowanie łatwy z wielkimi możliwościami
Mateusz Lubański Liquibase w praktyce 1 września 2016 26 / 30