2009-07-18 18 views
29

Po QuickStart na liquibase Utworzyłem changeset (bardzo głupi :))Jak pracować z liquibase, konkretny przykład

Kod:

<?xml version="1.0" encoding="UTF-8"?> 

<databaseChangeLog 
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.6" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.6 
     http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.6.xsd"> 

    <changeSet id="1" author="me"> 
     <createTable tableName="first_table"> 
      <column name="id" type="int"> 
       <constraints primaryKey="true" nullable="false"/> 
      </column> 
      <column name="name" type="varchar(50)"> 
       <constraints nullable="false"/> 
      </column> 
     </createTable> 
     <createTable tableName="new_table"> 
      <column name="id" type="int"> 
       <constraints primaryKey="true" nullable="false"/> 
      </column> 
     </createTable> 
    </changeSet> 

</databaseChangeLog> 

I utworzeniu schematu i czyste Uruchomiłem polecenie migracji.

Liquibase utworzyło bazę danych, wraz z tabelami bazy danych supportchartog i ..lock.

Jak mogę śledzić zmiany? I zostały zmodyfikowane w changeset dodanie nowego elementu CreateTable ale gdy próbuję „Update” polecenia liquibase mówi mi to

Migration Failed: Validation Failed: 
    1 change sets check sum 

więc nie sądzę, aby zrozumieli sposób do pracy z liquibase.

Ktoś może wskazać mi właściwy kierunek?

Dzięki

+0

Często podczas opracowywania nowej aplikacji lub dodawania nowych funkcji należy zmodyfikować swój system db pod kątem wymagań lub błędów. W przypadku nowej aplikacji odwołałem się do ręcznie wykonywanego skryptu, aby usunąć wszystkie tabele i usunąć wszystko z tabeli DATABASECHANGELOG (i dla tabeli LOCK dla dokładnej miary). Możesz rozwinąć pojedynczą zmianę, usuwając jej rekord z tabeli zmian i odwijając jej zmianę za pomocą anty-kwerendy: usuń dodane tabele, zmodyfikuj tabele/kolumny z powrotem itp. Gdybym używał runOnChange od samego początku, spowodowałoby to cięcie mój plik migrationations.xml o 50% i zaoszczędzony dużo czasu. –

+0

jeejava.com/spring-boot-liquibase-gradle-example/ – user3470953

Odpowiedz

37

Nigdy nie należy modyfikować <changeSet> która została już wykonana. Liquibase oblicza sumy kontrolne dla wszystkich wykonanych zmian i zapisuje je w dzienniku. Następnie przeliczy tę sumę kontrolną, porówna ją z zapisaną i nie powiedzie się przy kolejnym uruchomieniu, jeśli sumy kontrolne różnią się.

Zamiast tego należy dodać inny<changeSet> i umieścić w nim swój nowy element createTable.

QuickStart dobrze się czyta, ale rzeczywiście jest szybki :-) Zapoznaj się z pełną wersją manual, w szczególności jej sekcją ChangeSet.

+1

jasne, nie znalazłem i nie przeczytałem tej strony w instrukcji :) – apelliciari

+3

Są momenty, w których trzeba zmodyfikować opublikowane elementy ChangeSet. Zobacz odpowiedź runOnChange, którą Javid podał, aby uzyskać więcej informacji. Kiedyś robiliśmy "nigdy się nie zmieniało", ale okazało się, że jest to bardzo trudna polityka, z którą należy się zmierzyć, kiedy trzeba zaktualizować zestaw zmian (a to przydarzy się tobie, gdy będziesz bardziej zaangażowany w płynność). Pozostaw opcje otwarte. –

+0

Dzięki! jest to dokładna odpowiedź. –

26

Ta obecnie zaakceptowana odpowiedź jest nieco nieaktualna na podstawie zmian w Liquibase 2.x. W wersji 2.x Liquibase nadal się nie powiedzie, jeśli suma kontrolna md5 zmieniła się dla zestawu zmian, ale możesz określić atrybut runOnChange, jeśli chcesz móc go zmodyfikować.

Z documentation:

runOnChange - Wykonuje zmianę po raz pierwszy jest widoczny i za każdym razem zestaw zmiana została zmieniona

+2

Ta odpowiedź powinna być rozpatrywana w połączeniu z zaakceptowaną odpowiedzią. runOnChange pozwoli ci zmodyfikować istniejący zestaw zmian. Przyjęta odpowiedź jest słuszna, mówiąc, że nie powinieneś zmieniać istniejących zestawów zmian, ale są sytuacje, w których może zajść taka potrzeba, a polityka powinna na to pozwolić. –

+0

"Czasem być może trzeba", na przykład w środowisku programistycznym i wprowadzaniu zmian w trakcie programowania. Byłoby dziwnie, gdyby twoje pierwsze wdrożenie do środowiska prod. Miało garść powiązanych ze sobą, nakładających się i sprzecznych zestawów zmian. –

3

Jeśli jest to zmiana na changeset że zasadniczo już zostało zrobione, możesz ręcznie zmodyfikować bazę danych, aby jej zestaw md5 dla tego zestawu zmian pasował do nowego. Dobry dla drobnych zmian w tekście. Możesz też usunąć ten wiersz zestawu zmian ze swojej tabeli.

+0

Robię to bardzo często, ale uważam, że lepiej jest usunąć rekord i odświeżyć zmianę ręcznie, niż bałagan z sumą md5. Tylko raz, gdy DB aplikacji zostało zmodyfikowane przez ręczny skrypt w produkcji, skorzystałem z edycji md5sum. –