v0.35 FAQ

PgMig. FAQ

1. Каково назначение проекта?

Для баз данных СУБД Postgresql организовать размещение DDL запросов в файлах под контролем СКВ с гарантией соответствия этих файлов содержимому БД.

2. Как организован DDL?

  • DDL размещается в файлах и загружается из них в БД
  • Файлы разбиты на папки, каждая папка - весь DDL некоторой схемы БД

3. Как производится обновление кода в БД?

Обновление заданной схемы БД:

  • Из git получаем исходники нужной версии
  • Начинаем транзакцию
  • В БД удаляем схему данных
  • Загружаем в БД исходники схемы
  • Завершаем транзакцию

4. Как быть с изменяемыми в процессе работы данными?

Таблицы с такими данным (далее - оперативными данными) размещаются в отдельных схемах БД и не удаляются при обновлении. В этих схемах размещаются только такие таблицы и используемые в них типы.

5. Как быть с зависимостями оперативных данных?

У таблиц оперативных данных может быть два вида зависимостей:

  • внешние ключи
  • значения по умолчанию

Эти зависимости при создании регистрируются в служебных таблицах и удаляются перед удалением связанной схемы

6. Как быть с зависимостями от других схем БД?

Если в проекте есть схемы А и В, при этом схема В использует что-то из А, то схема В

  • должна создаваться после схемы А
  • должна удаляться перед схемой А

Из этого следует, что схемы не должны иметь циклических зависимостей

7. Как тестировать изменения?

Для тестирования можно использовать служебные функции, которые сравнивают результат запроса с эталоном и, при несовпадении

  • выводят отличия (чтобы результат было удобно использовать в качестве эталона)
  • генерируют ошибку (это позволяет не сделать COMMIT по завершении)

Если в начале каждого теста выполнить SAVEPOINT, по завершении - ROLLBACK TO SAVEPOINT, то будут выполнены все тесты независимо от результата каждого из них (кроме этого, тесты не будут мешать друг другу)

8. Можно ли обновить код хранимых функций, ничего не удаляя?

В случае если

  • функции создаются конструкцией вида CREATE OR REPLACE FUNCTION
  • файлы, в которых размещены функции, содержат только их

всегда есть возможность выполнить этот файл (в т.ч. с помощью psql).

Более удобным может оказаться обновление в рамках инструкции “обновить код всех функций, прогнать тесты и сделать commit в случае отсутствия ошибок”. Для этого в pgmig предназначена отдельная команда

9. Как менять структуру оперативных данных?

Т.к. схемы с оперативными данными не удаляются, изменения в них - это операции, которые в каждой БД должны выполниться однократно. Это можно реализовать так:

  • изменения помещать в файлы с заданной маской имени (например - *_once.sql)
  • в служебной таблице БД хранить имен загруженных файлов
  • при попытке загрузить файл, который уже зарегистрирован - ничего не делать