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


14

Розглянемо наступне налаштування:

  • Виробничий БД
  • Db db, на якому вносяться зміни схеми для включення нових функцій

Після завершення розробки нової функції мені доведеться вручну оновлювати схему prod db до тих пір, поки pg_dump --schema-onlyдля обох БД не буде однаково. Цей процес схильний до помилок і стомлюючий.

Отже, я шукаю інструмент, який може:

  • Показати підсумок відмінностей між двома схемами (як diff). Зауважте, що я шукаю не просто текстовий розбіг схеми, а більш досконалий інструмент, який може робити висновки на зразок "У таблиці Xє новий стовпець Y".
  • Автогенерувати код SQL, який би перетворив одну схему в іншу (наприклад patch)

Чи є інструмент схеми diff / patch , який може допомогти мені перетворити схеми prod у більш просунуті схеми розробника?


2
Замість того, щоб робити відмінності, вам слід керувати міграційними сценаріями контрольованим чином. Ніколи не змінюйте спеціальні DDL-зміни в СУБД, завжди вводите зміни в сценарій (який зберігається в системі управління версіями), а потім застосуйте сценарій. Загляньте в такі інструменти, як Liquibase або Flyway
a_horse_with_no_name

1
@a_horse_with_no_name Дякую Навіть при такому підході інструмент diff / patch полегшив би моє життя. До речі, я не можу не співати пісню.
Адам Матан

Ви можете спробувати pg_comparator: pgfoundry.org/projects/pg-comparator (я ніколи не використовував його). У Liquibase також є вбудований розріз і він видає результати як набір змін Liquibase, якщо я не помиляюся, тому це може стати хорошою відправною точкою для більш керованого управління схемою
a_horse_with_no_name

Спасибі. Хочете опублікувати це як відповідь, щоб я міг подати заяву?
Адам Матан

Відповіді:


11

Вибачте, що відновив старе питання

Останнім часом я використовую інструмент управління базами даних 0xDBE DataGrip від JetBrains.

Він підтримує декілька двигунів баз даних, у відмінному IDE Jetbrains, і ключовою особливістю, яку я вважаю корисною, є можливість складання diffдвох таблиць (DEV та PROD).

Нижче - знімок екрана різної дії (у цьому випадку є лише одна різниця стовпців). Скріншот є результатом кнопки "Об'єднати право" вгорі, генеруючи SQL, необхідний для підведення потрібної таблиці до нуля.

0xDBE SQL таблиця різниця

Сподіваюся, що цей новий інструмент допомагає.


3
З відродженням старих питань не виникає жодних проблем (для цього є навіть значки). І питання: чи можна порівняти цілі бази даних (я маю на увазі принаймні всі таблиці в них)?
dezso

@dezso - Дякую за запевнення. Так, ви можете порівняти на рівні бази даних, схеми та таблиці.
Еван

1
@BasilBourque - У меню ліворуч Databaseвиберіть 2 таблиці, які ви хочете порівняти (з cmd/ctrl + click), клацніть правою кнопкою миші та виберітьCompare
Ewan

3
Нещодавно я натрапив на новий інструмент, написаний python, migra . Він може відстежувати зміни до змін у таблицях, поданнях, функціях, індексах, обмеженнях, перерахунках, послідовностях та встановлених розширеннях, а також може використовуватися як бібліотека
скрипти

1
@Ewan Також migra відстежує все в обох базах даних, включаючи тригери та функції. Але DataGrip ні. Ось чому я заважаю використовувати DataGrip як різний інструмент. Недоліки також є: 1) міграція є лише інструментом PostgreSQL; 2) migra не відслідковує зміни, але не завжди створює відповідні оператори DDL, наприклад, таблицю alter ... додайте стовпчик, крапку замість таблиці alter ... перейменуйте стовпчик тощо. І я не знайшов жодного інструменту, який виробляє виправити команди DDL. Їм завжди потрібна полірування. Крім того, без якогось інструменту міграції, наприклад Liquibase, будь-які зміни бази даних будуть занадто складними.
Винищувач13

6

Використовуйте ліквідну базу .

Він підтримує diff , генеруючи db з нуля, виправляючи db, відкочуючи db та купу інших речей.

Вам раніше доводилося писати все в XML за допомогою liquidibase, але вже не. Ви можете написати 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 або що-небудь у вас є.


Проблема в тому, що він не отримує впорядкування чи видалення обмежень та первинних ключів правильно.
монах

2
Flyway - це ще один вибір, схожий на Liquibase.
Василь Бурке
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.