Проблемы при импорте TXT-файла в Postgres с помощью PHP
Я пытаюсь импортировать файл txt/csv в мою базу данных postgres из php с помощью команды "\copy". Я не могу использовать COPY вместо \ copy, так как мне нужно, чтобы он выполнялся как клиент PSQL. Мой код:
$query = '\\'.'copy data1 FROM "data1.txt" WITH CSV HEADER DELIMITER AS "," QUOTE AS "^"';
$result = pg_query($conn,$query);
if (!$result) {
echo "cannot copy data\n";
} else {
echo "SUCCESS!";
}
Когда я запускаю этот файл php, я получаю эту ошибку:
PHP Warning: pg_query(): Query failed: ERROR: syntax error at or near "\"
LINE 1: \copy data1 FROM "data1.txt" WITH ...
^ in script.php on line 30
1 ответ
На самом деле, вы не можете запустить \copy
с помощью pg_query()
, Это не команда SQL. Это мета-команда клиентаpsql.
Там вы можете извинить:
\copy data1 FROM 'data1.txt' WITH CSV HEADER DELIMITER AS ',' QUOTE AS '^'
Или выполните команду shell:
psql mydb -c "\copy data1 FROM 'data1.txt'
WITH CSV HEADER DELIMITER AS ',' QUOTE AS '^'"
Обратите внимание на цитаты. Значения должны быть заключены в одинарные кавычки в PostgreSQL: 'value'
,
Двойные кавычки предназначены для идентификаторов - и фактически нужны только для идентификаторов с заглавными или недопустимыми символами или для зарезервированных слов: "My table"
,
Я столкнулся с той же проблемой, но вместо использования необработанного psql
\copy
команда решила использовать Ecto.Adapters.SQL.stream/2
функция для чтения содержимого файла и Repo.transaction/1
который выполняет обычный SQL COPY
команда получения данных из STDIN
предоставленный потоком, как описано в этом блоге. Я не тестировал его производительность, но решил, что это будет хорошим дополнением к этому ответу.