2015-06-11 31 views
5

Używam Liquibase 3.3.5 do aktualizacji mojej bazy danych. Posiadanie kontekstów jest dobrym sposobem na wykonanie tylko określonych części dziennika zmian. Ale nie rozumiem, dlaczego WSZYSTKIE zestawy zmian są wykonywane, gdy nie podano kontekstu aktualizacji. Rozważmy następujący przykład:Dlaczego wszystkie konteksty są wykonywane, gdy nie podano w aktualizacji?

  • changeset A: context = testu
  • changeset B: brak kontekstu
  • changeset C: context = prod

Więc

  • wykonywania aktualizacji z context = test, wykona zestaw zmian A + B.
  • wykonanie aktualizacji z context = prod, wykona zestaw zmian B + C.
  • wykonanie aktualizacji bez kontekstu, wykona zestaw zmian A + B + C.

Dla mnie to w ogóle nie ma sensu :).

Spodziewam się, że tylko zestaw zmian B zostanie wykonany, ponieważ nie definiuje określonego kontekstu.

W przykładzie kontekstów Liquibase: http://www.liquibase.org/documentation/contexts.html ("Korzystanie z kontekstów dla danych testowych") mówią, że należy oznaczyć zestawy zmian do testowania za pomocą "testu" i wykonać je z podaniem kontekstu "test" do zastosowania danych testowych. W porządku - sensu. Ale

"Kiedy przychodzi czas na migrację produkcyjnej bazy danych, nie dołączaj kontekstu" test ", a dane testowe nie będą dołączane. "

Tak więc, jeśli nie będę określenie«test»kontekst podczas wykonywania aktualizacji produkcyjną, to byłoby wykonać«test»Zestawienia zmian, a także, ponieważ ja nie określił kontekst w ogóle.

ponownie, chciałbym się spodziewać, że pomijając testu na wykonanie aktualizacji, by wykonać tylko regularnego Zestawienia zmian bez się Zestawienia zmian testowe.

Albo ja czegoś brakuje tutaj :)?

Odpowiedz

7

to jest po prostu jak Liquibase prace - jeśli wykonasz aktualizację i nie określają kontekstu, wtedy wszystkie zestawy zmian są uważane za odpowiednie dla tej operacji aktualizacji.

Było kilka sposobów, które można było wdrożyć, a zespół programistów musiał wybrać jedną.

  1. jeśli nie określisz kontekstu podczas operacji aktualizacji, wówczas nie zostaną uwzględnione żadne zestawy zmian.
  2. jeśli nie określisz kontekstu, wówczas rozważane są wszystkie zestawy zmian.
  3. jeśli nie określisz kontekstu, wtedy rozważane są tylko zestawy zmiennych, które nie mają kontekstu.
  4. Jeśli nie określisz kontekstu i żaden zestaw zmian nie ma kontekstów, to wszystkie zestawy zmian są uwzględniane, ale jeśli niektóre zestawy zmian mają konteksty, przejdź do opcji 1, 2 lub 3 powyżej.

Zespół mógł wybrać opcję 3 (która odpowiada oczekiwaniom), ale zdecydowała się dawno temu, aby wybrać opcję 2, ponieważ wydawało się, że jest to "najlepszy" sposób w tym czasie. W tym czasie nie byłem w zespole, więc nie wiem nic więcej.

+0

Ok, dzięki za wyjaśnienie :)! Zmiana, która zepsułaby kompatybilność wsteczną, to na pewno. Ale jako nowy użytkownik Liquibase, nie wydawało mi się to "naturalne", stąd pytanie. Jeśli zawsze używasz kontekstu, wydaje się, że jest tak, aby zrobić to w ten sposób. Czy są jakieś plany zmiany tego zachowania? – javg

+0

Jak już zauważyłeś, zmiana go przerwie kompatybilność wsteczną, więc jest bardzo mało prawdopodobne, aby się zmieniła. Byłoby korzystne ulepszenie dokumentacji. Jeśli jesteś zainteresowany, cała dokumentacja jest w GitHub, a zespół z zadowoleniem przyjmuje prośby o odciągnięcie! https://github.com/liquibase/liquibase.github.com ps - jeśli moja odpowiedź była pomocna, proszę "zaakceptuj" jako poprawną odpowiedź. – SteveDonie

1

Dla @javg może być za późno, ale może to przynieść korzyści przyszłym czytelnikom. Wymóg ten może zostać osiągnięty w sposób następujący:

changeset A: context=test 
changeset B: context=all 
changeset C: context=prod 

Więc

executing update with "context=test,all" will execute changeset A+B. 
executing update with "context=all,prod" will execute changeset B+C. 
executing update with "context=all" will only execute changeset B as you expect. 
1

dodam rozwiązanie ze mną (z mojego punktu widzenia zachowanie domyślne Liquibase nie jest intuicyjne). W naszym projekcie do czynienia z „problemem” my skonfigurowany kontekst liquibase w ten sposób:

liquibase.setChangeLog("classpath*:liquibase/master.xml"); 
contexts = StringUtils.isBlank(contexts) ? "none" : contexts; 
liquibase.setContexts(contexts); 

To sprawi, że liquibase będzie uruchomić wszystkie przełączenia zestawów z kontekstu „brak” i wszystkich domyślnych przełączenia zestawów (zmiana zestawów bez kontekstu) - tak, tak to działa.

Wybierz więc nazwę, której nikt z twojego zespołu nie będzie używał ("none" w naszym przypadku) jako nazwa kontekstu, a następnie uruchom domyślnie z tego kontekstu (patrz przykład). Dzięki temu podejściu uruchomisz zestawy zmian bez żadnego kontekstu, co według mnie powinno być domyślnym podejściem!