PostgreSQL: утилита сравнения схем / исправлений [закрыто]

14

Рассмотрим следующую настройку:

  • Производственная БД
  • БД разработчика, в которой вносятся изменения схемы для включения новых функций

Когда разработка новой функции будет завершена, мне придется вручную обновлять схему prod db, пока pg_dump --schema-onlyобе базы данных не будут идентичны. Этот процесс подвержен ошибкам и утомителен.

Итак, я ищу инструмент, который может:

  • Показать сводку различий между двумя схемами (как diff). Обратите внимание, что я не ищу простой текстовой различий схемы, но более сложный инструмент, который может сделать выводы, такие как «Таблица Xимеет новый столбец Y».
  • Автоматически генерировать код SQL, который конвертирует одну схему в другую (например patch)

Существует ли инструмент diff / patch для схем, который может помочь мне преобразовать схемы prod в более сложные схемы dev?

Адам Матан
источник
2
Вместо того, чтобы делать diff, вы должны управлять сценариями миграции контролируемым образом. Никогда не вносите специальные изменения DDL в СУБД, всегда помещайте изменения в сценарий (который хранится в системе контроля версий), а затем применяйте сценарий. Посмотрите на такие инструменты, как Liquibase или
Flyway
1
@a_horse_with_no_name Спасибо. Даже при таком подходе инструмент diff / patch сделает мою жизнь проще. Кстати, я не могу не напевать песню.
Адам Матан
Вы можете попробовать pg_comparator: pgfoundry.org/projects/pg-comparator ( хотя я никогда не использовал его). Liquibase также имеет встроенный diff и выдает результаты в виде набора изменений Liquibase, если я не ошибаюсь, так что это может быть хорошей отправной точкой для более управляемого управления схемой
a_horse_with_no_name
Благодарю. Хотите опубликовать это как ответ, чтобы я мог проголосовать?
Адам Матан

Ответы:

11

Извините, что воскресил старый вопрос

В последнее время я использую 0xDBE DataGrip инструмент управления базами данных по JetBrains.

Он поддерживает несколько механизмов баз данных в отличной среде разработки Jetbrains, и ключевой функцией, которую я нашел полезной, является возможность работы с diff2 таблицами (DEV и PROD).

Ниже приведен скриншот различия в действии (в этом случае разница только в одном столбце). Снимок экрана является результатом кнопки «Слить справа» вверху, генерирующей SQL, необходимый для создания правильной таблицы с нуля.

0xDBE SQL Table Diff

Надеюсь, этот новый инструмент поможет.

Ewan
источник
3
Нет проблем с воскрешением старых вопросов (из этого есть даже значки). И вопрос: можно ли сравнить целые базы данных (я имею в виду, по крайней мере, все таблицы в них)?
Дезсо
@dezso - Спасибо за заверение. Да, вы можете сравнить на уровне базы данных, схемы и таблицы.
Ewan
1
@BasilBourque - В левом Databaseменю выберите 2 таблицы, которые вы хотите сравнить (с cmd/ctrl + click), щелкните правой кнопкой мыши и выберитеCompare
Ewan
3
Недавно я наткнулся на новый инструмент, написанный на python, migra . Он может отслеживать изменения в таблицах, представлениях, функциях, индексах, ограничениях, перечислениях, последовательностях и установленных расширениях, а также может использоваться как библиотека
сценарии
1
@Ewan Кроме того, migra отслеживает все в обеих базах данных, включая триггеры и функции. Но DataGrip нет. Вот почему я не рекомендую использовать DataGrip в качестве инструмента сравнения. Недостатки также присутствуют: 1) migra - это только инструмент PostgreSQL; 2) migra отслеживает изменения, но не всегда выдает соответствующие операторы DDL, такие как alter table ... добавить столбец, drop column вместо alter table ... переименовать столбец и т. Д. И я не нашел ни одного инструмента, который производит правильные команды DDL. Они всегда нуждаются в полировке. Кроме того, без какого-либо инструмента миграции, такого как Liquibase, любые модификации базы данных будут слишком сложными.
Уничтожитель 13
6

Используйте ликвидазу .

Он поддерживает diff , генерирует БД с нуля, исправляет БД, откатывает БД и кучу других вещей.

Раньше вам приходилось писать все на XML с использованием liquibase, но больше нет. Вы можете написать 99% на выбранном вами диалекте SQL. Пример:

--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;

Вы должны держать свои жидкие журналы в git или что у вас есть.

Нил Макгиган
источник
Проблема с этим состоит в том, что он не получает правильное упорядочение или удаление ограничений и первичных ключей.
Monksy
2
Flyway - это еще один вариант, похожий на Liquibase.
Базилик Бурк