write_between¶
- PGPackDumper.write_between(
- table_dest,
- table_src=None,
- query_src=None,
- dumper_src=None,
- )
- Параметры:
table_dest (str) – Имя целевой таблицы для записи данных
table_src (str | None) – Имя исходной таблицы для чтения данных
query_src (str | None) – SQL-запрос для выборки данных из источника
dumper_src (PGPackDumper | object | None) – Экземпляр PGPackDumper или другой объект-ридер для источника данных
- Результат:
None- Тип результата:
None
- Исключение:
PGPackDumperWriteBetweenError – При ошибках переноса данных
Перенос данных между PostgreSQL/GreenPlum серверами или из других источников. Поддерживает передачу данных между разными серверами, между таблицами на одном сервере, а также из внешних источников через StreamReader.
Описание:
Метод выполняет перенос данных из источника в целевую таблицу PostgreSQL/GreenPlum. Поддерживает несколько сценариев использования:
Межсерверный перенос - передача данных между разными серверами PostgreSQL/GreenPlum
Внутрисерверное копирование - копирование данных между таблицами на одном сервере
Перенос из внешних источников - загрузка данных из StreamReader или совместимых объектов
Копирование по запросу - передача результатов SQL-запроса вместо всей таблицы
Метод использует COPY протокол PostgreSQL для эффективной потоковой передачи данных и автоматически обрабатывает метаданные таблиц.
Параметры:
Параметр |
Тип |
Описание |
|---|---|---|
|
|
Обязательный. Имя таблицы на целевом сервере куда будут записаны данные. Формат: |
|
|
Имя таблицы на исходном сервере для чтения данных. Используется, если не указан |
|
|
SQL-запрос для выборки данных из источника. Имеет приоритет над |
|
|
Источник данных. Может быть экземпляром PGPackDumper (для PostgreSQL/GreenPlum), StreamReader или другого совместимого объекта. Если |
Режимы работы:
Совместимый PGPackDumper источник - когда
dumper_srcявляется PGPackDumper, используется его соединение и буферStreamReader источник - когда
dumper_srcимеет методto_reader(), данные читаются через StreamReaderАвтономное соединение - когда
dumper_src=None, создается новое соединение к текущему серверу
Примеры использования:
# Пример 1: Копирование таблицы между серверами PostgreSQL
from pgpack_dumper import PGPackDumper, PGConnector
# Подключение к целевому серверу
dest_connector = PGConnector(host="target-host", port=5432, dbname="target_db")
dest_dumper = PGPackDumper(dest_connector)
# Подключение к исходному серверу
src_connector = PGConnector(host="source-host", port=5432, dbname="source_db")
src_dumper = PGPackDumper(src_connector)
# Копирование всей таблицы между серверами
dest_dumper.write_between(
table_dest="public.users_backup",
table_src="public.users",
dumper_src=src_dumper
)
# Пример 2: Внутрисерверное копирование с фильтрацией
dest_dumper.write_between(
table_dest="archive.old_orders",
query_src="SELECT * FROM sales.orders WHERE order_date < '2023-01-01'",
dumper_src=None # Используется тот же сервер
)
# Пример 3: Перенос данных между схемами на одном сервере
dest_dumper.write_between(
table_dest="reporting.monthly_summary",
table_src="staging.daily_data",
dumper_src=None
)
# Пример 4: Перенос из другого источника данных
# Предположим, что other_reader - совместимый объект с методом to_reader()
dest_dumper.write_between(
table_dest="import.external_data",
dumper_src=other_reader
)
# Пример 5: Копирование с преобразованием данных
dest_dumper.write_between(
table_dest="analytics.user_stats",
query_src="""
SELECT
user_id,
COUNT(*) as total_orders,
SUM(amount) as total_amount,
AVG(amount) as avg_order_value
FROM sales.orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY user_id
""",
dumper_src=src_dumper
)
Обработка ошибок:
# Пример 1: Обработка ошибок соединения
try:
dest_dumper.write_between(
table_dest="public.target_table",
table_src="public.source_table",
dumper_src=src_dumper
)
except PGPackDumperWriteBetweenError as e:
print(f"Ошибка переноса данных: {e}")
# Возможные причины: таблица не существует, проблема с правами доступа,
# несоответствие структуры таблиц, ошибка сети
# Пример 2: Проверка доступности источника
if dumper_src is None:
print("Используется автономное соединение к текущему серверу")
elif hasattr(dumper_src, 'dbname'):
print(f"Источник: {dumper_src.dbname}")
Метаданные и логирование:
Метод автоматически логирует информацию о передаче данных:
Диаграмма передачи - показывает источник и назначение с метаданными
Информация о соединениях - детали подключения к серверам
Размер переданных данных - при использовании StreamReader источников
Особенности и рекомендации:
COPY протокол - используется для максимальной производительности
Автоматический commit - транзакция фиксируется после успешного переноса
Обновление соединения - целевое соединение обновляется после операции
Сборка мусора - вызывается для освобождения памяти
Метаданные - автоматически извлекаются и сравниваются структуры таблиц
Требования к данным:
Структурная совместимость - структура данных источника должна быть совместима с целевой таблицей
Типы данных - типы должны быть преобразуемы или идентичны
Права доступа - пользователь должен иметь права на чтение из источника и запись в цель
Производительность:
Потоковая передача - данные передаются потоково без загрузки в память целиком
Буферизация - используется эффективная буферизация через CopyBuffer
Параллелизм - можно выполнять несколько переносов параллельно
Сжатие - поддерживается если источник и цель используют сжатие PGPack
Примечания:
Для GreenPlum требуется учет особенностей распределенных таблиц
При переносе между разными версиями PostgreSQL могут быть особенности
Большие таблицы рекомендуется переносить частями для избежания блокировок
Метод не поддерживает DDL операции - таблицы должны существовать заранее
См. также:
read_dump - Чтение данных в PGPack формат
write_dump - Запись данных из PGPack формата
to_reader - Получение StreamReader для данных
CopyBuffer- Буфер для операций COPY