Pg copy from: примеры (PHP)

Функция pg_copy_from для импорта данных в PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_copy_from(PgSql\Connection $connection, string $table_name, array $rows, string $separator = "\t", string $null_as = "\\\\N"): bool

Описание функции pg_copy_from

Функция pg_copy_from выполняет массовую вставку данных из массива PHP в таблицу PostgreSQL, используя команду COPY FROM.

Когда используется

Функция применяется для быстрого импорта больших объемов структурированных данных, когда важна производительность. Она эффективнее множественных INSERT.

Аргументы функции
  • connection — ресурс соединения с PostgreSQL.
  • table_name — имя таблицы для вставки данных (строка).
  • rows — массив строк для вставки. Каждый элемент — строка с данными, разделенными разделителем.
  • delimiter — символ-разделитель полей (по умолчанию — табуляция).
  • null_as — строка, которая интерпретируется как NULL (по умолчанию — "\\\\N").

Примеры использования pg_copy_from

Базовый пример
<?
$conn = pg_connect("host=localhost dbname=test");
$data = [
    "1\tИван\t25",
    "2\tПетр\t30"
];
$result = pg_copy_from($conn, 'users', $data);
echo $result ? 'Данные загружены' : 'Ошибка';
?>
Данные загружены
С указанием разделителя
<?
$data = [
    "1,Иван,25",
    "2,Петр,30"
];
$result = pg_copy_from($conn, 'users', $data, ',');
?>
С обработкой NULL значений
<?
$data = [
    "3\tNULL\t35",
    "4\tМария\t\\N"
];
$result = pg_copy_from($conn, 'users', $data, "\t", "NULL");
?>

Альтернативы в PHP

Вставляет одну строку. Подходит для одиночных операций.

pg_prepare + pg_execute

Подготовленные запросы. Используются для многократного выполнения с разными параметрами.

pg_query с INSERT

Простые запросы. Медленнее для больших объемов данных.

Экспорт данных из таблицы в массив. Обратная операция.

Аналоги в других языках

Python (psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test")
cursor = conn.cursor()
cursor.copy_from(open('data.csv'), 'users', sep='\t')
conn.commit()
Node.js (node-postgres)
const { Client } = require('pg');
const client = new Client();
await client.connect();
const stream = client.query(
    copyFrom('COPY users FROM STDIN WITH (FORMAT csv)')
);
stream.write('1,Иван,25\n');
stream.end();

Pg copy from в MySQL

Команда LOAD DATA INFILE для загрузки из файла. Прямого аналога для массивов нет.

Типичные ошибки

Неверный формат данных
<?
$data = ["1,Иван"]; // Не хватает столбцов
$result = pg_copy_from($conn, 'users', $data);
?>
Warning: pg_copy_from(): 7 column(s) needed for copy
Отсутствие соединения
<?
$result = pg_copy_from(null, 'users', $data);
?>
Warning: pg_copy_from() expects parameter 1 to be resource, null given
Специальные символы

Если данные содержат разделитель, это нарушит структуру. Нужно экранировать.

Изменения в версиях PHP

В PHP 8.0 изменен тип аргумента connection: теперь ожидается ресурс PgSql\Connection, а не resource. В PHP 8.1 добавлена поддержка PgSql\Connection как объекта.

Расширенные примеры

Импорт CSV данных
Пример php
<?
$file = file('data.csv'); // Чтение файла в массив
$result = pg_copy_from($conn, 'table', $file, ',');
?>
Обработка JSON полей
Пример php
<?
$data = [
    "1\t{\"city\": \"Москва\"}"
];
$result = pg_copy_from($conn, 'users', $data);
?>
Использование с генератором данных
Пример php
<?
function generateData($count) {
    for ($i = 0; $i < $count; $i++) {
        yield "$i\tИмя$i\t" . rand(20, 50);
    }
}
$data = iterator_to_array(generateData(1000));
pg_copy_from($conn, 'big_table', $data);
?>
Вставка с преобразованием типов
Пример php
<?
$data = array_map(function($row) {
    $parts = explode(',', $row);
    $parts[2] = (int)$parts[2]; // Преобразование возраста в число
    return implode(',', $parts);
}, $rawData);
pg_copy_from($conn, 'users', $data, ',');
?>

PHP pg_copy_from function comments

En
Pg copy from Insert records into a table from an array