Практикум: переход с pg_partman на pg-partsmith¶
Во временном контейнере PostgreSQL 17 расширение pg_partman 5.5.0 создаёт и обслуживает месячные партиции events. Затем передаём обслуживание pg-partsmith 1.8.0, сверяя объекты таблиц и данные. Сценарий разобран в статье.
Dockerfile устанавливает pg_partman из исходников с фиксированным тегом v5.5.0, без фонового воркера. Все вызовы обслуживания выполняет сам практикум, поэтому старое задание не может вмешаться в переход. Зависимости Python закреплены через файл соседнего практикума хранения партиций. При копировании примера сохраните оба каталога.
Исходники находятся в docs/blog/lab/2026-09-07-migrating-from-pg-partman. Из этого каталога, с запущенным Docker и установленным uv, выполните:
docker build -t pg-partman-lab:17 .
uv run --no-project --python 3.13 --with-requirements requirements.txt python partman_lab.py
Для сборки образа нужен доступ к репозиториям Debian/PostgreSQL и GitHub. Скрипт проверяет:
partman.create_partitionработает с закреплённой версией расширения. Границы месяцев отсчитываются от времени PostgreSQL, которым пользуется и pg_partman.automatic_maintenance='off'отключает общее обслуживание, но явныйrun_maintenance('public.events')всё ещё может создать нужную партицию. Проверка выполняется до перехода.- Изучение схемы и построение плана не меняют таблицы. Имена
events_p...распознаются по границам; отсоединённые pg_partman таблицы без метки не попадают под удаление. premake = Nпревращается вCreateAhead(count=N + 1), потому что pg-partsmith считает и текущий месяц;retention = '3 months'вKeepNewest(count=4);retention_keep_table = trueвDropNever(). С таким соответствием первый план pg-partsmith пуст.- После удаления записи таблицы из
part_configдаже явныйrun_maintenance('public.events')ничего не меняет. - План на следующий месяц создаёт одну партицию и отсоединяет самую старую, которую сохраняет
DropNever(). OID существующих таблиц и все строки сохраняются, следующий план пуст, DEFAULT остаётся пустым.
adoption_flow.py содержит функции настройки и снятия регистрации из статьи; partman_lab.py выполняет проверки. Общие средства запуска БД импортируются из соседнего каталога 2026-09-07-partition-retention.
При переходе реального сервиса сохраните полные настройки и список таблиц, остановите автоматические и явно адресованные задания, дождитесь активных запусков и только затем снимайте регистрацию. Часовой пояс, интервал, шаблоны, DEFAULT, публикации и правила хранения сопоставляйте отдельно. Этот пример ограничен простой месячной таблицей и не является универсальным конвертером настроек.
При успехе скрипт печатает четыре строки PASS и завершается с кодом 0. Контейнер удаляется при выходе; собранный локально Docker-образ остаётся для повторных запусков.