Sql

Copy postgresql: PostgreSQL : Документация: 9.5: COPY : Компания Postgres Professional

Содержание

Копирование и преобразование данных в базе данных Azure для PostgreSQL — Фабрика данных Azure и Azure Synapse

  • Статья
  • 15 минут на чтение

ПРИМЕНЯЕТСЯ К: Фабрика данных Azure Azure Synapse Analytics

В этой статье рассказывается, как использовать действие копирования в конвейерах Фабрики данных Azure и Synapse Analytics для копирования данных из и в базу данных Azure для PostgreSQL, а также использовать поток данных для преобразования данных в базе данных Azure для PostgreSQL. Чтобы узнать больше, прочтите вводные статьи о Фабрике данных Azure и Synapse Analytics.

Этот соединитель предназначен для службы базы данных Azure для PostgreSQL. Чтобы скопировать данные из универсальной базы данных PostgreSQL, расположенной локально или в облаке, используйте коннектор PostgreSQL.

Поддерживаемые возможности

Этот соединитель базы данных Azure для PostgreSQL поддерживается для следующих возможностей:

Поддерживаемые возможности ИК Управляемая частная конечная точка
Копирование (источник/приемник) ① ②
Отображение потока данных (источник/приемник)
Поисковая активность ① ②

① Среда выполнения интеграции Azure ② Локальная среда выполнения интеграции

Три действия работают со всеми вариантами развертывания базы данных Azure для PostgreSQL:

  • Отдельный сервер
  • Гибкий сервер
  • Гипермасштаб (Цитус)

Приступая к работе

Для выполнения операции копирования с конвейером можно использовать один из следующих инструментов или SDK:

  • Инструмент копирования данных
  • Портал Azure
  • Пакет SDK для . NET
  • Пакет SDK для Python
  • Azure PowerShell
  • REST API
  • Шаблон Azure Resource Manager

Создайте связанную службу с базой данных Azure для PostgreSQL с помощью пользовательского интерфейса

Выполните следующие действия, чтобы создать связанную службу с базой данных Azure для PostgreSQL в пользовательском интерфейсе портала Azure.

  1. Перейдите на вкладку «Управление» в фабрике данных Azure или рабочей области Synapse и выберите «Связанные службы», затем нажмите «Создать»:

    .
    • Фабрика данных Azure
    • Синапс Azure

  2. Найдите PostgreSQL и выберите базу данных Azure для соединителя PostgreSQL.

  3. Настройте сведения о службе, проверьте соединение и создайте новую связанную службу.

Сведения о конфигурации соединителя

В следующих разделах приведены сведения о свойствах, которые используются для определения сущностей фабрики данных, характерных для соединителя базы данных Azure для PostgreSQL.

Для связанной службы базы данных Azure для PostgreSQL поддерживаются следующие свойства:

Свойство Описание Обязательно
тип Для свойства type должно быть установлено значение: Азурепостгрескл . Да
строка соединения Строка подключения ODBC для подключения к базе данных Azure для PostgreSQL.
Вы также можете указать пароль в Azure Key Vault и извлечь конфигурацию пароля из строки подключения. Дополнительные сведения см. в следующих примерах и учетных данных Store в Azure Key Vault.
Да
подключение через Это свойство представляет среду выполнения интеграции, которая будет использоваться для подключения к хранилищу данных. Вы можете использовать среду выполнения интеграции Azure или локальную среду выполнения интеграции (если ваше хранилище данных находится в частной сети). Если он не указан, используется среда выполнения интеграции Azure по умолчанию.

Типичная строка подключения: Server=.postgres.database.azure.com;Database=;Port=;UID=;Password= . Вот дополнительные свойства, которые вы можете установить для своего случая:

Свойство Описание Опции Обязательно
Метод шифрования (EM) Метод, используемый драйвером для шифрования данных, передаваемых между драйвером и сервером базы данных. Например,
Метод шифрования=<0/1/6>;
0 (Без шифрования) (По умолчанию) / 1 (SSL) / 6 (RequestSSL)
Проверка сертификата сервера (VSC) Определяет, проверяет ли драйвер сертификат, отправленный сервером базы данных, когда включено шифрование SSL (метод шифрования = 1). Например, ValidateServerCertificate=<0/1>; 0 (отключено) (по умолчанию) / 1 (включено)

Пример :

 {
    "name": "AzurePostgreSqlLinkedService",
    "характеристики": {
        "тип": "AzurePostgreSql",
        "типСвойства": {
            "connectionString": "Server=.postgres.database.azure.com;Database=
;Port=;UID=;Password=" } } }

Пример :

Сохранить пароль в Azure Key Vault

 {
    "name": "AzurePostgreSqlLinkedService",
    "характеристики": {
        "тип": "AzurePostgreSql",
        "типСвойства": {
            "connectionString": "Server=.postgres.database.azure.com;Database=;Port=;UID=;",
            "пароль": {
                "type": "AzureKeyVaultSecret",
                "хранить": {
                    "referenceName": "<имя связанной службы Azure Key Vault>",
                    "type": "LinkedServiceReference"
                },
                "secretName": ""
            }
        }
    }
}
 

Свойства набора данных

Полный список разделов и свойств, доступных для определения наборов данных, см.

в разделе Наборы данных. В этом разделе приведен список свойств, которые база данных Azure для PostgreSQL поддерживает в наборах данных.

Чтобы скопировать данные из базы данных Azure для PostgreSQL, задайте для свойства type набора данных значение AzurePostgreSqlTable . Поддерживаются следующие свойства:

.
Свойство Описание Обязательно
тип Для свойства типа набора данных должно быть задано значение AzurePostgreSqlTable Да
имя_таблицы Имя таблицы Нет (если в источнике активности указан запрос)

Пример :

 {
    "name": "AzurePostgreSqlDataset",
    "характеристики": {
        "тип": "AzurePostgreSqlTable",
        "linkedServiceName": {
            "referenceName": "<имя связанной службы AzurePostgreSql>
", "type": "ЛинкедСервисРеференс" }, "типпропертиес": {} } }

Копировать свойства действий

Полный список разделов и свойств, доступных для определения действий, см. в разделе Конвейеры и действия. В этом разделе приведен список свойств, поддерживаемых базой данных Azure для исходного кода PostgreSQL.

База данных Azure для PostgreSql в качестве источника

Чтобы скопировать данные из базы данных Azure для PostgreSQL, установите тип источника в действии копирования на AzurePostgreSqlSource . Следующие свойства поддерживаются в действии копирования источник раздел:

.
свойство Описание Обязательно
тип Для свойства type источника действия копирования должно быть задано значение AzurePostgreSqlSource Да
запрос Используйте пользовательский запрос SQL для чтения данных. Например: SELECT * FROM mytable или SELECT * FROM "MyTable" . Обратите внимание, что в PostgreSQL имя сущности обрабатывается без учета регистра, если оно не заключено в кавычки.
Нет (если указано свойство tableName в наборе данных)
Параметры раздела Указывает параметры секционирования данных, используемые для загрузки данных из базы данных SQL Azure.
Допустимые значения: Нет (по умолчанию), PhysicalPartitionsOfTable и DynamicRange .
Если параметр раздела включен (то есть не Нет ), степень параллелизма для одновременной загрузки данных из базы данных SQL Azure контролируется параметр parallelCopies для действия копирования.
Настройки раздела Укажите группу настроек для разделения данных.
Применить, если параметр раздела не равен Нет .
Под Настройки раздела :
имена разделов Список физических разделов, которые необходимо скопировать.
Применить, если параметр раздела равен ФизическиеРазделыТаблицы . Если вы используете запрос для получения исходных данных, перехватите ?AdfTabularPartitionName в предложении WHERE. Пример см. в разделе Параллельная копия из базы данных Azure для PostgreSQL.
имя_раздела_столбца Укажите имя исходного столбца в формате integer или date/datetime ( int , smallint , bigint , date , timestamp без часового пояса , метка времени с часовым поясом или время без часового пояса ), которые будут использоваться при разделении диапазона для параллельного копирования. Если не указано, первичный ключ таблицы определяется автоматически и используется в качестве столбца раздела.
Применить, если параметр раздела равен DynamicRange . Если вы используете запрос для получения исходных данных, перехватите ?AdfRangePartitionColumnName в предложении WHERE. Пример см. в разделе Параллельная копия из базы данных Azure для PostgreSQL.
перегородка Апперграунд Максимальное значение столбца раздела для копирования данных.
Применить, если параметр раздела равен DynamicRange . Если вы используете запрос для получения исходных данных, перехватите ?AdfRangePartitionUpbound в предложении WHERE. Пример см. в разделе Параллельная копия из базы данных Azure для PostgreSQL.
перегородкаЛоуэрграунд Минимальное значение столбца раздела для копирования данных.
Применить, если параметр раздела равен DynamicRange . Если вы используете запрос для получения исходных данных, перехватите ?AdfRangePartitionLowbound в предложении WHERE. Пример см. в разделе Параллельная копия из базы данных Azure для PostgreSQL.

Пример :

 "деятельность":[
    {
        "name": "КопироватьFromAzurePostgreSql",
        "тип": "Копировать",
        "входы": [
            {
                "referenceName": "<имя входного набора данных AzurePostgreSql>",
                "тип": "Ссылка на набор данных"
            }
        ],
        "выход": [
            {
                "referenceName": "<имя выходного набора данных>",
                "тип": "Ссылка на набор данных"
            }
        ],
        "типСвойства": {
            "источник": {
                "тип": "AzurePostgreSqlSource",
                "query": "<пользовательский запрос, например, SELECT * FROM mytable>"
            },
            "раковина": {
                "type": "<тип раковины>"
            }
        }
    }
]
 

База данных Azure для PostgreSQL в качестве приемника

Чтобы скопировать данные в базу данных Azure для PostgreSQL, в разделе действия копирования приемника поддерживаются следующие свойства:

Свойство Описание Обязательно
тип Для свойства type приемника действия копирования должно быть задано значение AzurePostgreSQLSink . Да
преКопиСкрипт Укажите SQL-запрос для действия копирования, которое будет выполняться перед записью данных в базу данных Azure для PostgreSQL при каждом запуске. Это свойство можно использовать для очистки предварительно загруженных данных.
метод записи Метод, используемый для записи данных в базу данных Azure для PostgreSQL.
Допустимые значения: CopyCommand (по умолчанию, что более эффективно), BulkInsert .
writeBatchSize Количество строк, загруженных в базу данных Azure для PostgreSQL за пакет.
Допустимое значение — целое число, представляющее количество строк.
Нет (по умолчанию 1 000 000)
writeBatchTimeout Время ожидания завершения операции пакетной вставки до истечения времени ожидания.
Допустимые значения — строки временного интервала. Например, 00:30:00 (30 минут).
Нет (по умолчанию 00:30:00)

Пример :

 "деятельность":[
    {
        "name": "CopyToAzureDatabaseForPostgreSQL",
        "тип": "Копировать",
        "входы": [
            {
                "referenceName": "<имя входного набора данных>",
                "тип": "Ссылка на набор данных"
            }
        ],
        "выход": [
            {
                "referenceName": "<имя выходного набора данных Azure PostgreSQL>",
                "тип": "Ссылка на набор данных"
            }
        ],
        "типСвойства": {
            "источник": {
                "type": "<тип источника>"
            },
            "раковина": {
                "тип": "AzurePostgreSQLSink",
                "preCopyScript": "<пользовательский скрипт SQL>",
                "writeMethod": "КопироватьКоманду",
                "writeBatchSize": 1000000
            }
        }
    }
]
 

Параллельное копирование из базы данных Azure для PostgreSQL

Соединитель базы данных Azure для PostgreSQL в действии копирования обеспечивает встроенное разделение данных для параллельного копирования данных. Параметры разделения данных можно найти на вкладке Source действия копирования.

При включении секционированного копирования действие копирования выполняет параллельные запросы к базе данных Azure для источника PostgreSQL для загрузки данных по секциям. Степень параллельности контролируется параметр parallelCopies для действия копирования. Например, если вы установите для parallelCopies значение четыре, служба одновременно создаст и выполнит четыре запроса на основе указанного параметра и параметров раздела, и каждый запрос извлечет часть данных из вашей базы данных Azure для PostgreSQL.

Рекомендуется включить параллельное копирование с разделением данных, особенно при загрузке большого объема данных из базы данных Azure для PostgreSQL. Ниже приведены рекомендуемые конфигурации для различных сценариев. При копировании данных в файловое хранилище данных рекомендуется записывать в папку как несколько файлов (указывать только имя папки), в этом случае производительность выше, чем при записи в один файл.

Сценарий Предлагаемые настройки
Полная загрузка из большой таблицы с физическими разделами. Параметр раздела : Физические разделы таблицы.

Во время выполнения служба автоматически определяет физические разделы и копирует данные по разделам.

Полная загрузка из большой таблицы, без физических разделов, но с целочисленным столбцом для разделения данных. Параметры раздела : Раздел динамического диапазона.
Столбец раздела : укажите столбец, используемый для разделения данных. Если не указано, используется столбец первичного ключа.
Загрузка большого объема данных с помощью пользовательского запроса с физическими разделами. Параметр раздела : Физические разделы таблицы.
Запрос : SELECT * FROM ?AdfTabularPartitionName WHERE .
Имя раздела : Укажите имена разделов, из которых следует копировать данные. Если не указано иное, служба автоматически обнаружит физические разделы в таблице, которую вы указали в наборе данных PostgreSQL.

Во время выполнения служба заменяет ?AdfTabularPartitionName фактическим именем раздела и отправляет в базу данных Azure для PostgreSQL.

Загрузка большого объема данных с помощью пользовательского запроса без физических разделов, но с целочисленным столбцом для разделения данных. Параметры раздела : Раздел динамического диапазона.
Запрос : SELECT * FROM ?AdfTabularPartitionName WHERE ?AdfRangePartitionColumnName <= ?AdfRangePartitionUpbound AND ?AdfRangePartitionColumnName >= ?AdfRangePartitionLowbound AND .
Столбец раздела : укажите столбец, используемый для разделения данных. Вы можете разделить столбец с целочисленным типом данных или датой/датой и временем.
Верхняя граница раздела и нижняя граница раздела : Укажите, хотите ли вы фильтровать по столбцу раздела, чтобы получать данные только между нижним и верхним диапазоном.

Во время выполнения служба заменяет ?AdfRangePartitionColumnName , ?AdfRangePartitionUpbound и ?AdfRangePartitionLowbound фактическим именем столбца и диапазонами значений для каждой секции и отправляет в базу данных Azure для PostgreSQL.
Например, если для столбца раздела «ID» установлена ​​нижняя граница 1 и верхняя граница 80, а для параллельного копирования задано значение 4, служба извлекает данные по 4 секциям. Их идентификаторы находятся между [1,20], [21, 40], [41, 60] и [61, 80] соответственно.

Рекомендации по загрузке данных с опцией разделения:

  1. Выберите особый столбец в качестве столбца раздела (например, первичный ключ или уникальный ключ), чтобы избежать перекоса данных.
  2. Если таблица имеет встроенный раздел, используйте параметр раздела «Физические разделы таблицы» для повышения производительности.
  3. Если вы используете Azure Integration Runtime для копирования данных, вы можете установить более крупные «Единицы интеграции данных (DIU)» (> 4), чтобы использовать больше вычислительных ресурсов. Проверьте применимые сценарии там.
  4. «Степень параллелизма копирования» управляет номерами разделов, слишком большое значение этого числа иногда снижает производительность, рекомендуется установить это число как (DIU или количество собственных IR-узлов) * (от 2 до 4).

Пример: полная загрузка из большой таблицы с физическими разделами

 "источник": {
    "тип": "AzurePostgreSqlSource",
    "partitionOption": "PhysicalPartitionsOfTable"
}
 

Пример: запрос с разделом динамического диапазона

 "источник": {
    "тип": "AzurePostgreSqlSource",
    "query":"SELECT * FROM  WHERE ?AdfDynamicRangePartitionCondition AND ",
    "partitionOption": "Динамический диапазон",
    "Настройки раздела": {
        "partitionColumnName": "",
        "partitionUpperBound": "",
        "partitionLowerBound": ""
    }
}
 

Свойства потока данных сопоставления

При преобразовании данных в потоке сопоставления данных вы можете читать и записывать в таблицы из базы данных Azure для PostgreSQL. Дополнительные сведения см. в разделе преобразование источника и преобразование приемника в сопоставлении потоков данных. Вы можете использовать базу данных Azure для набора данных PostgreSQL или встроенный набор данных в качестве типа источника и приемника.

Исходное преобразование

В таблице ниже перечислены свойства, поддерживаемые базой данных Azure для источника PostgreSQL. Вы можете редактировать эти свойства в Параметры источника вкладка.

Имя Описание Обязательно Допустимые значения Свойство сценария потока данных
Стол Если в качестве входных данных выбрать Таблица, поток данных извлечет все данные из таблицы, указанной в наборе данных. (только для встроенного набора данных)
tableName
ЗапросЕсли вы выберете Запрос в качестве входных данных, укажите SQL-запрос для извлечения данных из источника, который переопределяет любую таблицу, указанную вами в наборе данных. Использование запросов — отличный способ уменьшить количество строк для тестирования или поиска.

Предложение Order By не поддерживается, но вы можете установить полный оператор SELECT FROM. Вы также можете использовать пользовательские табличные функции. select * from udfGetData() — это пользовательская функция в SQL, которая возвращает таблицу, которую можно использовать в потоке данных.
Пример запроса: select * from mytable, где customerId > 1000 и customerId < 2000 или выберите * из "MyTable" . Обратите внимание, что в PostgreSQL имя сущности обрабатывается без учета регистра, если оно не заключено в кавычки.

Строка запрос
Имя схемы Если вы выберете Хранимая процедура в качестве входных данных, укажите имя схемы хранимой процедуры или выберите Обновить, чтобы попросить службу обнаружить имена схем. Строка имя_схемы
Хранимая процедура Если вы выберете Хранимая процедура в качестве входных данных, укажите имя хранимой процедуры для чтения данных из исходной таблицы или выберите Обновить, чтобы попросить службу обнаружить имена процедур. Да (если в качестве входных данных выбрана хранимая процедура) Строка имя_процедуры
Параметры процедуры Если вы выбрали Хранимая процедура в качестве входных данных, укажите любые входные параметры для хранимой процедуры в порядке, установленном в процедуре, или выберите Импорт, чтобы импортировать все параметры процедуры, используя форму @paraName . Массив входов
Размер партии Укажите размер пакета для разделения больших данных на пакеты. Целое число размер партии
Уровень изоляции Выберите один из следующих уровней изоляции:
— Чтение подтверждено
— Чтение не зафиксировано (по умолчанию)
— Повторяемое чтение
— Сериализуемый
— Нет (игнорировать уровень изоляции)
READ_COMMITTED
READ_UNCOMMITTED
REPEATABLE_READ
SERIALIZABLE
НЕТ
уровень изоляции
Пример исходного сценария базы данных Azure для PostgreSQL

При использовании базы данных Azure для PostgreSQL в качестве типа источника связанный сценарий потока данных:

 источник (allowSchemaDrift: true,
    валидатесхема: ложь,
    уровень изоляции: «READ_UNCOMMITTED»,
    запрос: 'выбрать * из mytable',
    формат: 'запрос') ~> AzurePostgreSQLSource
 

Преобразование приемника

В таблице ниже перечислены свойства, поддерживаемые базой данных Azure для приемника PostgreSQL. Вы можете редактировать эти свойства на вкладке Опции приемника .

Имя Описание Обязательно Допустимые значения Свойство сценария потока данных
Метод обновления Укажите, какие операции разрешены для вашей базы данных. По умолчанию разрешены только вставки.
Чтобы обновить, добавить или удалить строки, требуется преобразование строки "Изменить", чтобы пометить строки для этих действий.
Да верно или неверно удаляемый
вставляемый
обновляемый
вставляемый
Ключевые столбцы Для обновлений, вставок и удалений ключевые столбцы должны быть установлены, чтобы определить, какую строку следует изменить.
Имя столбца, выбранное вами в качестве ключа, будет использоваться как часть последующего обновления, добавления и удаления. Следовательно, вы должны выбрать столбец, существующий в отображении приемника.
Массив ключи
Пропустить запись ключевых столбцов Если вы не хотите записывать значение в ключевой столбец, выберите «Пропустить запись ключевых столбцов». верно или неверно скипКейВрайтс
Действие стола Определяет, следует ли воссоздавать или удалять все строки из целевой таблицы перед записью.
- Нет : С таблицей не будет выполнено никаких действий.
- Воссоздать : Таблица будет удалена и создана заново. Требуется при динамическом создании новой таблицы.
- Truncate : все строки из целевой таблицы будут удалены.
верно или неверно воссоздать
урезать
Размер партии Укажите, сколько строк записывается в каждом пакете. Пакеты большего размера улучшают сжатие и оптимизацию памяти, но при кэшировании данных возникает риск нехватки памяти. Целое число размер партии
Выберите пользовательскую схему БД По умолчанию временная таблица будет создана в схеме приемника как промежуточная. В качестве альтернативы можно снять флажок Использовать схему приемника и вместо этого указать имя схемы, под которым Фабрика данных создаст промежуточную таблицу для загрузки восходящих данных и их автоматической очистки после завершения. Убедитесь, что у вас есть разрешение на создание таблицы в базе данных и разрешение на изменение схемы. Строка stagingSchemaName
Скрипты до и после SQL Укажите многострочные сценарии SQL, которые будут выполняться до (предварительная обработка) и после (постобработка) данных, записанных в базу данных Sink. Строка preSQL
postSQL

Совет

  1. Рекомендуется разбивать одиночные пакетные сценарии с несколькими командами на несколько пакетов.
  2. Только операторы языка определения данных (DDL) и языка манипулирования данными (DML), которые возвращают простой счетчик обновлений, могут выполняться как часть пакета. Дополнительные сведения см. в разделе Выполнение пакетных операций
  3. .
  • Включить добавочное извлечение. Используйте этот параметр, чтобы указать ADF обрабатывать только те строки, которые изменились с момента последнего выполнения конвейера.

  • Добавочный столбец: при использовании функции добавочного извлечения вы должны выбрать дату/время или числовой столбец, который вы хотите использовать в качестве водяного знака в исходной таблице.

  • Начать чтение с начала: установка этого параметра с добавочным извлечением заставит ADF читать все строки при первом выполнении конвейера с включенным добавочным извлечением.

Пример сценария приемника базы данных Azure для PostgreSQL

При использовании базы данных Azure для PostgreSQL в качестве типа приемника связанный сценарий потока данных:

 Приемник IncomingStream (allowSchemaDrift: true,
    валидатесхема: ложь,
    удаляемый: ложь,
    вставляемый: правда,
    обновляемый: правда,
    upsertable: правда,
    ключи: ['keyColumn'],
    формат: 'таблица',
    skipDuplicateMapInputs: правда,
    skipDuplicateMapOutputs: true) ~> AzurePostgreSQLSink
 

Свойства действия поиска

Дополнительные сведения о свойствах см. в разделе Действие поиска.

Следующие шаги

Список хранилищ данных, поддерживаемых действием копирования в качестве источников и приемников, см. в разделе Поддерживаемые хранилища данных.

Использование COPY TO и COPY FROM

Переключить боковую панель оглавления

Psycopg позволяет работать с протоколом COPY PostgreSQL. КОПИЯ есть один из наиболее эффективных способов загрузки данных в базу данных (и изменения это, с некоторой изобретательностью SQL).

Копирование поддерживается с помощью метода Cursor.copy() , передавая ему запрос форму COPY... FROM STDIN или COPY... TO STDOUT и управлять результирующий Скопируйте объект в с блоком :

 с cursor.copy("COPY table_name (col1, col2) FROM STDIN") в качестве копии:
    # передать данные объекту 'copy' с помощью write()/write_row()
 

Вы можете составить оператор COPY динамически, используя объекты из psycopg. sql 9Модуль 0164:

 с курсором.copy(
    sql.SQL("КОПИРОВАТЬ {} В STDOUT").format(sql.Identifier("table_name"))
) как копия:
    # прочитать данные из объекта 'copy', используя read()/read_row()
 

Изменено в версии 3.1: Вы также можете передавать параметры в copy() , как в execute() :

 с помощью cur.copy("COPY (SELECT * FROM table_name LIMIT %s) TO STDOUT", (3 ,)) как копия:
    # ожидать не более трех записей
 

Соединение подчиняется обычному поведению транзакций, поэтому, если соединение находится в состоянии автоматической фиксации, в конце операции COPY вы все равно будете должны зафиксировать ожидающие изменения, и вы все равно можете их откатить. Видеть Управление транзакциями для деталей.

Запись данных построчно

Используя операцию копирования, вы можете загрузить данные в базу данных из любого Python iterable (список кортежей или любая итерируемая последовательность): значения Python адаптированы так, как они были бы в обычном запросе. Для выполнения такой операции используйте a COPY... FROM STDIN с Cursor.copy() и использовать write_row() на полученный объект в блоке с . При выходе из блока операция будет завершена:

 записей = [(10, 20, "привет"), (40, нет, "мир")]
с помощью cursor.copy("COPY sample (col1, col2, col3) FROM STDIN") в качестве копии:
    для записи в протоколы:
        copy.write_row(запись)
 

Если внутри блока возникает исключение, операция прерывается и вставленные до сих пор записи отбрасываются.

Для чтения или записи из Копировать построчно можно не указывать КОПИРОВАТЬ параметры, такие как ФОРМАТ CSV , DELIMITER , НУЛЕВОЕ : пожалуйста, оставьте эти данные в покое, спасибо 🙂

Чтение данных построчно

Вы также можете сделать обратное, читая строки из COPY ... TO STDOUT операция, повторяя rows() . Однако это не то, что вы может захотеть сделать как обычно: обычно обычный процесс запроса будет проще использовать.

В настоящее время PostgreSQL не предоставляет полную информацию о типе COPY. TO , поэтому возвращаемые строки будут содержать не проанализированные данные в виде строк или байтов, согласно формату.

 с cur.copy("COPY (VALUES (10::int, current_date)) TO STDOUT") как копия:
    для строки в copy.rows():
        print(row) # вернуть непроанализированные данные: ('10', '2046-12-24')
 

Вы можете улучшить результаты, используя set_types() перед чтением, но вы должны указать их самостоятельно.

 с cur.copy("COPY (VALUES (10::int, current_date)) TO STDOUT") как копия:
    copy.set_types(["int4", "дата"])
    для строки в copy.rows():
        print(row) # (10, datetime.date(2046, 12, 24))
 

Поблочное копирование

Если данные уже отформатированы таким образом, чтобы их можно было копировать (например, потому что он исходит из файла, полученного в результате предыдущей операции COPY TO ), он может быть загружены в базу данных с помощью Copy. write() вместо этого.

 с открытым ("данные", "r") как f:
    с cursor.copy("COPY data FROM STDIN") в качестве копии:
        в то время как данные: = f.read (BLOCK_SIZE):
            копировать.записать(данные)
 

В этом случае вы можете использовать любые КОПИРОВАТЬ вариант и формат, если входные данные совместимы с тем, что ожидает операция в copy() . Данные можно передать как str , если копия имеет формат FORMAT TEXT , или как байт , который работает как с FORMAT TEXT , так и с FORMAT BINARY .

Для создания данных в формате COPY вы можете использовать команду COPY ... TO Оператор STDOUT и повторите полученный объект Copy , который будет создать поток байта объекта:

 с open("data.out", "wb") как f:
    с помощью cursor.copy("COPY table_name TO STDOUT") в качестве копии:
        для данных в копии:
            f. запись (данные)
 

Двоичная копия

Двоичная копия поддерживается указанием FORMAT BINARY в поле COPY . утверждение. Чтобы импортировать двоичные данные с помощью write_row() , все типы, передаваемые в базу данных, должны иметь зарегистрированный бинарный дампер; это не необходимо, если данные копируются поблочно с использованием запись() .

Предупреждение

PostgreSQL особенно привередлив при загрузке данных в двоичном режиме и будет применяться без правил приведения . Это означает, например, что прохождение значение 100 в целое число столбец не , потому что Psycopg пройдет это значение smallint , и сервер отклонит его, потому что его размер не соответствует ожидаемому.

Вы можете обойти проблему, используя метод set_types() Скопируйте объект, тщательно указав типы для загрузки.

См. также

Дополнительные сведения о двоичных запросах см. в разделе Двоичные параметры и результаты.

Поддержка асинхронного копирования

Асинхронные операции поддерживаются с использованием тех же шаблонов, что и выше, с использованием объекты, полученные AsyncConnection . Например, если f является объект, поддерживающий асинхронный метод read() , возвращающий данные COPY , полностью асинхронная операция копирования может быть:

 async с cursor.copy("COPY data FROM STDIN") в качестве копии:
    в то время как данные := ждут f.read():
        ожидание копирования.запись (данные)
 

Документация по объекту AsyncCopy описывает подпись асинхронные методы и отличия от его аналога sync Copy .

См. также

Дополнительные сведения об использовании асинхронных объектов см. в разделе Асинхронные операции.

Пример: копирование таблицы между серверами

Чтобы скопировать таблицу или часть таблицы между серверами, вы можете использовать две операции COPY на двух разных соединениях, чтение с первого и пишу второму.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *