Проблемы при импорте файла 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

person Himanshu Shekhar    schedule 15.01.2012    source источник
comment
Я не знаю pgsql, поэтому не могу вам в этом помочь, но я бы просто импортировал его в sqlite, а затем выполнил sql.   -  person RoboTamer    schedule 15.01.2012


Ответы (2)


На самом деле, вы не можете запустить \copy через pg_query(). Это не команда SQL. Это метакоманда клиента psql.

Там вы можете выполнить:

\copy data1 FROM 'data1.txt' WITH CSV HEADER DELIMITER AS ',' QUOTE AS '^'

Или запустите команду оболочки:

psql mydb -c "\copy data1 FROM 'data1.txt'
                WITH CSV HEADER DELIMITER AS ',' QUOTE AS '^'"

Обратите внимание на цитаты. Значения должны быть заключены в одинарные кавычки в PostgreSQL: 'value'.
Двойные кавычки предназначены для идентификаторов и фактически необходимы только для идентификаторов с заглавными буквами или недопустимых символов или для зарезервированных слов: "My table".

person Erwin Brandstetter    schedule 15.01.2012
comment
спасибо, Эрвин, я пробовал копировать как суперпользователь (используя COPY), и это сработало! - person Himanshu Shekhar; 15.01.2012
comment
в чем разница между COPY и \COPY? - person Timofey; 31.05.2014
comment
@Tim: COPY — это команда SQL, которая запускается на сервере. \copy — это команда psql, которая оборачивает COPY для использования клиентом (удобно для локальных файлов). - person Erwin Brandstetter; 01.06.2014

Я столкнулся с той же проблемой, но вместо использования необработанной команды psql \copy решил использовать функцию Ecto.Adapters.SQL.stream/2 для чтения содержимого файла и Repo.transaction/1, которая выполняет обычную команду SQL COPY, получая данные из STDIN, предоставленные потоком как описано в этом блоге. Я не проверял производительность этого, но подумал, что это будет хорошим дополнением к этому ответу.

person Ricoh    schedule 06.01.2020