Проблемы при импорте 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предоставленный потоком, как описано в этом блоге. Я не тестировал его производительность, но решил, что это будет хорошим дополнением к этому ответу.

Другие вопросы по тегам