Я использую Postgres 9.3 и PHP в приложении.
Я хотел бы импортировать большой файл Excell в postgres с несколькими необязательными зависимостями с родительскими таблицами (в основном я должен проверить, существует ли строка с этими родителями).
Я сделал это с помощью php for loop, но это кажется очень медленным. Поэтому я должен прийти с решением в функции postgres на уровне базы данных.
Кто-нибудь может сказать мне, как я могу отправить массив php в функцию postgres и зациклить массив в функции postgres, реализовать бизнес-правило в цикле и
вставить отдельный ряд в таблицу.
Самый быстрый интерфейс для массовой загрузки в PostgreSQL — это COPY API. С помощью этого API вы отправляете в PostgreSQL блоки строк (в строках) значений, разделенных выбранным разделителем. Этот метод очень быстрый. Вы можете загрузить родительские таблицы в хеш-таблицы (проверка должна быть быстрой), а проверенные данные можно отправить в Postgres.
Я ищу руководство по PHP — есть функция pg_copy_from, но работа с большими массивами в PHP может быть трудной из-за использования памяти (но это ужасно просто). Немного сложнее, но без высоких требований к памяти — путь с функцией pg_put_line.
<?php
$conn = pg_pconnect ("dbname=foo");
pg_query($conn, "CREATE TABLE bar (a int4, b char(16), d float8)");
pg_query($conn, "COPY bar FROM stdin");
pg_put_line($conn, "3\thello world\t4.5\n");
pg_put_line($conn, "4\tgoodbye world\t7.11\n");
pg_put_line($conn, "\\.\n");
pg_end_copy($conn);
?>
Других решений пока нет …