Git oraz Postgresql - mechanizm

Git oraz Postgresql - mechanizm
JA
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 lata
  • Postów:127
0

Cześć,

nie wiem dlaczego jak pytam o działanie gita z postgresql ludzie odsyłają mnie często do narzędzi.

Czy ktoś podpowie jak to powinno działać?

  1. Użytkownicy tworzą wersję nr 1, wyrzucają w czystym SQL (jako tekst) do repo na Gicie.
  2. Uzytkownicy tworzą wesję 2, wrzucają do GIT'a i GIT automatycznie łapie deltę, czyli jakie mamy różnice.

Czego ja tutaj nie rozumiem?
Dlaczego tutaj się tak zastanwiają nad tym...

https://stackoverflow.com/questions/846659/how-can-i-put-a-database-under-git-version-control

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Wrocław
0

Nie wiem czego nie rozumiesz, ale powiedz chociaż, co chcesz osiągnąć? Trzymać historię zmian schematu bazy? Czy o dane chodzi?

S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
1

Ale chcesz DDLe trzymac czy co? Ja np. w Javce korzystam z Liquibase - XML opisuje zmiany takie jak dodawanie nowych kolumn etc.


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:dzień
  • Postów:2792
1

@jaryszek: pokaże ci na przykładzie.
Załóżmy, że masz dwie tabele:
biblioteka(id PK, id_ksiązki, ...)
ksiazka(id PK, ...)
robisz sobie ich skrypty (załóżmy, że tabele są w tej kolejności w skrypcie - tak by pgdump zrobił) i nic się nie zmienia.
Pewnego dnia wpadasz o (słuszny) pomysł, że biblioteka(id_ksiazki) powinno być FK do ksiazka(id). Więc zakładasz go.
I teraz, nie dość, że zmieniła ci się struktura, to jeszcze wymuszona została inna kolejność tabel w skrypcie. Teraz ksiazki MUSZĄ być przed biblioteka.
Pomyśl sobie, jakie różnice będą w delta

JA
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 lata
  • Postów:127
0

@somekind: @scibi92 chodzi o ddl i dml, a więc o dwa z nich.

@Marcin.Miga dziękuję. To racja. No to rzeczywiście masakra by była.
Jednak, jakbym miał wersję 2 i chciał zrobić taki zabieg to musiałbym zdropować te tabele (wrócić do wersji 1) i jeszcze raz je założyć w dobrej koleności.
I w tym momencie mógłbym stracić dane...

Pozdrawiam,
Jacek

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
2

Delty tak naprawdę to powinno się pisać ręcznie.
Czy ktoś z Was stosuje na produkcji (tam gdzie są dane klientów) auto-generowane delty i to działa?
Jeśli tak to proszę o namiary na stosowane rozwiązanie.
Spotkałem się tylko raz z czymś takim - Sybase PowerDesigner potrafił to robić 15 lat temu, ale i tak nie miałem 100% zaufania.

edytowany 1x, ostatnio: vpiotr
PA
Używam red-gate (SQL Comparer), sprawdzam skrypty które generuje i nie pamiętam abym musial robić poprawki w wygenerowanym kodzie
JA
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 lata
  • Postów:127
0

@vpiotr a git złapie tekstową deltę przecież?

edytowany 1x, ostatnio: jaryszek
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0
jaryszek napisał(a):

@vpiotr a git złapie tekstową deltę przecież?

Tak, ale ja o innej delcie pisałem.
Jak wygenerujesz skrypt struktury bazy danych w całości, to pomiędzy wersjami są różnice w strukturze.

Żeby je zastosować masz dwa rozwiązania:
a) skasować wszystkie dane plus bazę i stworzyć bazę od nowa pełnym skryptem.
b) uruchomić specjalnie spreparowane ALTER TABLE itp. DDLe.

Ja o tym drugim.

JA
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 lata
  • Postów:127
0

@vpiotr: rozumiem. To dotyczy głównie jak chcesz wrócić do poprzedniej wersji prawda? Dla automatyzacji można napisać jedynie samemu skrypt. Ja bym poszedł w jakieś API i jakby byl insert to pisałbym odwrotność automatem na podstawie PK. Chociaż nie wiem czy po założeniu triggera na DDLe mógłbyś tak napisac odwrotnego sqlka aby móc to łatwo odnowić

Jacek

vpiotr
Raczej jak chcesz sie zupgradowac.
neves
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 14 godzin
  • Lokalizacja:Kraków
  • Postów:1114
0

Jak już zapewne zauważyłeś problem który starasz się rozwiązać jest bardzo trudny do rozwiązania w sposób automatyczny na relacyjnej bazie danych, skrypty migracyjne pomiędzy jednym i drugim schematem nawet jak są generowane automatycznie to i tak trzeba ręcznie poprawiać, już nie wspominając o śledzeniu zmian ddl i dml bez wsparcia ze strony bazy w stylu Temporal Tables w SQL Server jest ciężkie.

Ja bym się zastanowił nad alternatywnym rozwiązaniem problemu czyli jakaś baza dokumentowa + event sourcing jako bazowa architektura.
wersjonowanie dokumentów by rozwiązało problem z przełączaniem się pomiędzy schematami (ddl), ba jak dobrze by się napisało kod to jednocześnie mogłyby działać np wersje operujące na schemacie 3 i 5, na tych samych danych.
a event sourcing to po prostu zapisywanie każdej pojedynczej zmiany danych (dml).


edytowany 1x, ostatnio: neves
JA
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 lata
  • Postów:127
0

@neves dziękuję. Właśnie tak chcę rozwiązać ten problem.
Tworzyć różne schematy , gdzie schemat = wersja.

2 torowe rozwiązanie:

  1. Użytkownik tworzy wersję 2 (dodał tabele i rekordy), zakańcza, wrzuca do gita w czystym sql (ddl i dml oddzielnie) i widać różnice (deltę).
    1a. jak sie chce wrocic do poprzedniej wersji nalezy zrobic revert w GICie - wtedy sie straci dane niestety.
    1b. Chyba, że odwrócić tylko DDL a dane pozostawić, z tym że tutaj musiałby być skrypt, który pozwala nam revertowoć SQLki

  2. Dodatkowo z wersji 2 tworzona jest kopia schematu i zawsze użytkownik może wrócić, sprawdzić co było zmieniane.

Chcę zrobić jedną tabelę z historią dla DDL i DML łapanych po trigerrach.I dzięki temu revert sqlków nie będzie taki zły.
Większość z nich, typu insert zrobię automatem z FE (Access) lub jakoś może da się to zaprogramować bezpośrednio w postgresql po PK.

Jacek

edytowany 1x, ostatnio: jaryszek
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:32 minuty
  • Postów:2368
0

Nigdy nie spotkałem się z robieniem delty strukturalnej w bazie i aplikowaniu jej na produkcyjnym systemie (gdzie pojawia się również delta w danych...)

In-housowo mamy narzędzie, które:
a) wymaga utworzenia instancji repozytorium narzędzia (schemat bazodanowy)
b) wszystkie skrypty bazodanowe aplikowane są przez to narzędzie (w szczególności może zarządzać zmianami dla różnych systemów, różnych baz danych)
c) zmiany zorganizowane są w projekty: "instalacja od 0", "upgrade", "migracja między wersjami" , "mój wypasiony projekt"
d) W "upgrade" zmiany zorganizowane są na zasadzie paczek dla funkcjonalności bądź błędów (każdy plik z deskryptorem zmiany ma przyjętą konwencję nazewniczą: YYYYMMDD<seqno>_<ID buga/feature>.xml - więc przy tworzeniu releasu łatwo automatycznie wygenerować deskryptor projektu "wykonaj wszystko od 0 we właściwej kolejności" )
e) każdy deskryptor niesie metadane opisujące jak w ramach paczki skrypty mają być wykonywane (które zestawy skryptów sekwencyjne, które równolegle, jakie są zależności między zestawami skryptów, czy może być uruchomiony ponownie i masa innych funkcjonalności, które usprawniają zarządzanie releasami)

Development jest robiony przyrostowo (raz zreleasowane skrypty nie są modyfikowane!), np. może być taka historia:

  1. Utworz tabele FOO (rok 2000)
  2. Dodaj kolumne XYZ (rok 2003)
  3. Dodaj kolulmnę ABC (rok 2008)
  4. Ustaw dane w kolumnie ABC na podstawie danych z XYZ (razem z 3)
  5. Usuń kolumnę DEF (2012)
  6. Utworz trigger BAR (2018)

np. 2 klientów zaczyna używać systemu odpowiedni w 2004 i 2013 roku, to klient A przejdzie kilka "upgradów", a klientB będzie miał instalację od 0, na którą zostaną zaaplikoawne wszystkie upgrady.
W efekcie dla klientaB, krok 4 zostanie wykonany na "pustej kolekcji", zaś dla klientaA nie wiadomo co tam się uzbierało, ale wiadomo jak te dane zaktualizować.

JA
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 lata
  • Postów:127
0

Ciekawe rozwiązanie. Nie rozumiem połowy, ale sens rozumiem :)

YA
W razie wątpliwości najprościej zapytać. Nie będę ryzykował tłumaczenia połowy, którą rozumiesz:D
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Stacktrace
  • Postów:6821
0
  1. Liquidbase
  2. Flyway

Wybierz sobie jedno. Baza może być wtedy w kontenerze i masz w przysłowiowej pompie co się dzieje, bo po prostu budujesz bazę dla danego commita. Masz pełną historię zmian oraz automatyzację.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
JA
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 lata
  • Postów:127
0

@yarel: ja mam bardzo dużo pytań :) Stąd też boję się, że Cię zamęcze.

Nigdy nie spotkałem się z robieniem delty strukturalnej w bazie i aplikowaniu jej na produkcyjnym systemie (gdzie pojawia się również delta w danych...)
Dlatego, że to ja wymyśliłem.
To być może będę wyrzucał całego dumpa - i wtedy miał zawsze deltę.

a) wymaga utworzenia instancji repozytorium narzędzia (schemat bazodanowy)

Jakbym zrobił to na schematach gdzie trzymałbym każdą wersję oddzielnie to byłby podobny efekt?

@Koziołek:

Liquidbase
Flyway

Flyway - brak możliwości rollbacku.
Te narzedzia rejestruja nam tylko DDLe, a co z DMLami?

jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
0

Flyway - brak możliwości rollbacku.
Te narzedzia rejestruja nam tylko DDLe, a co z DMLami?

Flyway (inne też) nic nie rejestruje. Piszesz sobie sql na upgrade z wersji x do x+1, a czy to jest DDL, czy DML - Twoja rzecz.


Przeważnie ignoruję niezarejestrowanych użytkowników.
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Stacktrace
  • Postów:6821
0

@jaryszek: nie potrzebujesz rollbacku, bo budujesz z konkretnego commitu. Co do DMLi to są wspierane w liquidbase i we flyway.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
JA
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 lata
  • Postów:127
0

Dziękuję.

DDL ok, ale DML? Za każdym dodanym rekordem musiałby stać skrypt SQL, jak to zautomatyzowac?

Jacek

Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Stacktrace
  • Postów:6821
0

Za każdym dodanym rekordem musiałby stać skrypt SQL, jak to zautomatyzowac?

A tu z pomocą przychodzą loadery. Definiujesz plik CSV dla danej tabeli a potem tylko konfigurujesz, przykład z liquidbase https://www.liquibase.org/documentation/changes/load_data.html

Zatem twoja rola ogranicza się tylko do dostarczenia danych.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)