Pg copy from: примеры (PHP)
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, ',');
?><?
$data = [
"3\tNULL\t35",
"4\tМария\t\\N"
];
$result = pg_copy_from($conn, 'users', $data, "\t", "NULL");
?>Альтернативы в PHP
Вставляет одну строку. Подходит для одиночных операций.
Подготовленные запросы. Используются для многократного выполнения с разными параметрами.
Простые запросы. Медленнее для больших объемов данных.
Экспорт данных из таблицы в массив. Обратная операция.
Аналоги в других языках
import psycopg2
conn = psycopg2.connect("dbname=test")
cursor = conn.cursor()
cursor.copy_from(open('data.csv'), 'users', sep='\t')
conn.commit()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 как объекта.
Расширенные примеры
<?
$file = file('data.csv'); // Чтение файла в массив
$result = pg_copy_from($conn, 'table', $file, ',');
?><?
$data = [
"1\t{\"city\": \"Москва\"}"
];
$result = pg_copy_from($conn, 'users', $data);
?><?
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);
?><?
$data = array_map(function($row) {
$parts = explode(',', $row);
$parts[2] = (int)$parts[2]; // Преобразование возраста в число
return implode(',', $parts);
}, $rawData);
pg_copy_from($conn, 'users', $data, ',');
?>