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
) - в служебной таблице БД хранить имен загруженных файлов
- при попытке загрузить файл, который уже зарегистрирован - ничего не делать