create_temp¶
- DBHose.create_temp()¶
Создает таблицу для промежуточного хранения данных.
Описание:
Метод создает таблицу в целевой СУБД, которая используется как промежуточное хранилище данных перед их переносом в целевую таблицу. Таблица создается на основе DDL (Data Definition Language) целевой таблицы.
Сигнатура:
def create_temp(self) -> None: """Create temporary table."""
Процесс выполнения:
Получение DDL целевой таблицы:
query_ddl = read_text(ddl_path.format(self.dumper_dest.dbname)) reader = self.dumper_dest.to_reader( query_ddl.format(table=self.table_dest) )
Извлечение метаданных:
self.ddl, self.temp_ddl, self.table_temp = tuple(*reader.to_rows())
Валидация:
if not self.ddl: msg = f"Table {self.table_dest} not found!" raise ValueError(msg)
Создание таблицы:
self.dumper_dest.cursor.execute(self.temp_ddl) # Для PostgreSQL/Greenplum - коммит транзакции if self.dumper_dest.__class__ is not NativeDumper: self.dumper_dest.connect.commit() self.dumper_dest.copy_buffer.query = None
Атрибуты, обновляемые методом:
Обновляемые атрибуты¶ Атрибут
Описание
ddlDDL (Data Definition Language) целевой таблицы
temp_ddlDDL временной таблицы
table_tempИмя созданной временной таблицы
Примеры использования:
Базовый пример¶from dbhose_airflow import DBHose dbhose = DBHose( table_dest="public.users", connection_dest="postgres_target", ) # Создание временной таблицы dbhose.create_temp() print(f"Имя временной таблицы: {dbhose.table_temp}") print(f"DDL целевой таблицы: {dbhose.ddl[:100]}...") print(f"DDL временной таблицы: {dbhose.temp_ddl[:100]}...")
Логирование:
Метод логирует ключевые этапы выполнения.
Особенности для разных СУБД:
Ошибки и исключения:
Возможные исключения¶ Исключение
Причина
ValueErrorЦелевая таблица не существует
Практические рекомендации:
Проверка прав доступа:
# Перед созданием проверьте права if not has_table_create_permission(dbhose.connection_dest): raise PermissionError("Нет прав на создание таблиц")
Отладка с сохранением таблицы:
# Для отладки оставьте таблицу dbhose = DBHose( table_dest="my_table", connection_dest="my_db", drop_temp_table=False, # Не удалять автоматически ) dbhose.create_temp() # Проверьте созданную таблицу в БД
Примечания:
Имя промежуточной таблицы наследуюется от целевой с постфиксом _temp
Убедитесь в достаточности дискового пространства
Для больших таблиц PostgreSQL/Greenplum с партиционированием процесс может занимать больше времени
См. также:
drop_temp - Удаление промежуточной таблицы