PostgreSQL: narzędzie do różnicowania schematów / łatek [zamknięte]

14

Rozważ następujące ustawienie:

  • DB produkcyjny
  • Dev db, na którym dokonywane są zmiany schematu w celu włączenia nowych funkcji

Po zakończeniu opracowywania nowej funkcji muszę ręcznie zaktualizować schemat prod db, aż pg_dump --schema-onlyobie bazy danych będą identyczne. Ten proces jest podatny na błędy i żmudny.

Poszukuję narzędzia, które może:

  • Pokaż podsumowanie różnic między dwoma schematami (jak diff). Zauważ, że nie szukam jedynie różnic tekstowych schematu, ale bardziej rozbudowane narzędzie, które może wyciągać wnioski, takie jak „Tabela Xma nową kolumnę Y”.
  • Automatyczne generowanie kodu SQL, który konwertuje jeden schemat na inny (jak patch)

Czy istnieje narzędzie do różnicowania / łatania schematów , które może pomóc mi przekonwertować schematy prod na bardziej zaawansowane schematy programistyczne?

Adam Matan
źródło
2
Zamiast robić różnicę, powinieneś zarządzać skryptami migracji w kontrolowany sposób. Nigdy nie wprowadzaj ad hoc zmian DDL do DBMS, zawsze umieszczaj zmianę w skrypcie (który jest przechowywany w systemie kontroli wersji), a następnie zastosuj skrypt. Spójrz na narzędzia takie jak Liquibase lub Flyway
a_horse_with_no_name
1
@ a_horse_w_no_name Dzięki. Nawet przy takim podejściu narzędzie diff / patch ułatwiłoby mi życie. BTW, nie mogę pomóc nucić piosenkę.
Adam Matan,
Możesz spróbować pg_comparator: pgfoundry.org/projects/pg-comparator (chociaż nigdy go nie użyłem). Liquibase ma również wbudowany diff i emituje wyniki jako zestaw zmian Liquibase, jeśli się nie mylę, więc może to być dobry punkt wyjścia do bardziej kontrolowanego zarządzania schematem
a_horse_w_no_name
Dzięki. Chcesz opublikować go jako odpowiedź, aby móc głosować?
Adam Matan,

Odpowiedzi:

11

Przepraszamy za wskrzeszenie starego pytania

Ostatnio korzystam z narzędzia do zarządzania bazą danych 0xDBE DataGrip firmy JetBrains.

Obsługuje wiele silników baz danych, w doskonałym IDE Jetbrains, a kluczową cechą, którą uważam za przydatną, jest możliwość diff2 tabel (DEV i PROD).

Poniżej znajduje się zrzut ekranu różnicy w akcji (w tym przypadku występuje tylko jedna różnica kolumn). Zrzut ekranu jest rezultatem przycisku „Scal w prawo” u góry, generując kod SQL wymagany do doprowadzenia właściwej tabeli do zera.

0xDBE SQL Table Diff

Mam nadzieję, że to nowe narzędzie pomoże.

Ewan
źródło
3
Nie ma problemu ze wskrzeszaniem starych pytań (można nawet uzyskać od nich odznaki). I pytanie: czy można porównać całe bazy danych (mam na myśli przynajmniej wszystkie tabele w nich zawarte)?
dezso,
@dezso - Dzięki za zapewnienie. Tak, możesz porównać na poziomie bazy danych, schematu i tabeli.
Ewan
1
@BasilBourque - Z Databasemenu po lewej stronie wybierz 2 tabele, które chcesz porównać (z cmd/ctrl + click), kliknij prawym przyciskiem myszy i wybierzCompare
Ewan
3
Ostatnio natknąłem się na nowe narzędzie napisane w python, migra . Może śledzić zmiany w tabelach, widokach, funkcjach, indeksach, ograniczeniach, wyliczeniach, sekwencjach i zainstalowanych rozszerzeniach, a także może być używany jako biblioteka
skrypty
1
@Ewan Również migra śledzi wszystko w obu bazach danych, w tym wyzwalacze i funkcje. Ale DataGrip nie. Dlatego odradzam używanie DataGrip jako narzędzia do porównywania. Występują także wady: 1) migra jest tylko narzędziem PostgreSQL; 2) migra śledzi zmiany, ale nie zawsze wytwarza odpowiednie operatory DDL, takie jak alter table ... dodaj kolumnę, upuść kolumnę zamiast alter table ... zmień nazwę kolumny itp. I nie znalazłem żadnego narzędzia, które produkuje poprawne polecenia DDL. Zawsze potrzebują polerowania. Ponadto bez narzędzi do migracji, takich jak Liquibase, wszelkie modyfikacje bazy danych będą zbyt skomplikowane.
Exterminator13,
6

Użyj likibazy .

Obsługuje diff , generowanie db od zera, łatanie db, wycofywanie db i kilka innych rzeczy.

Kiedyś musiałeś pisać wszystko w XML przy pomocy liquibase, ale już nie. Możesz napisać 99% tego w wybranym przez siebie dialekcie SQL. Przykład:

--liquibase formatted sql

--changeset neil:1 

create table contacts(
  contact_id serial primary key,
  name text not null unique
);

--changeset neil:2
alter table contacts add column phone_num text;

Powinieneś trzymać swoje dzienniki zmian likibazy w git lub czymkolwiek, co masz.

Neil McGuigan
źródło
Problem polega na tym, że nie zapewnia prawidłowego porządkowania lub usuwania ograniczeń i kluczy podstawowych.
mnich
2
Flyway to kolejny wybór podobny do Liquibase.
Basil Bourque,