Почему оператор PostgreSQL терпит неудачу на апострофе, когда синтаксис выглядит правильным? - PullRequest
0 голосов
/ 13 марта 2020

Интересно, кто-нибудь сталкивался с проблемой, когда PostgreSQL исключает один апостроф? Я выполняю свой оператор PostgreSQL из командной строки linux, чтобы скопировать данные из файла CSV в таблицу.

Таблица уже создана, и файл находится в правильном каталоге с правильными разрешениями, владельцем и именем.

Верхний синтаксис неправильный, а нижний, который выглядит идентично, правильный.

--This line errors.
\copy nyc_addresses from '/home/postgres/city_of_new_york.csv' WITH (FORMAT CSV, HEADER);
--This line executes successfully.
\copy nyc_addresses from '/home/postgres/city_of_new_york.csv' WITH (FORMAT CSV, HEADER);

Методом проб и ошибок нам удалось установить sh, что проблема связана с первым апострофом в верхней строке кода, но не могу понять, почему.

Если это помогает, отображается сообщение об ошибке:

/home/postgres/city_of_new_york.csv: No such file or directory

Кто-нибудь может объяснить, что может быть причиной этого?

1 Ответ

1 голос
/ 13 марта 2020

Альтернативой COPY CSV-файлам PostgreSQL является cat и передача их в команду COPY FROM STDIN. Этот подход работает независимо от того, установлена ​​ли база данных локально или на удаленном сервере.

$ cat file.csv | psql -U user -d db -c "COPY table FROM STDIN CSV HEADER"

EDIT : Как отметил Ник Барнс (см. Комментарии) cat, очевидно, необходимо имеют те же разрешения, что и \copy, что не решает загадочную проблему OP.

@ Jetchisel предложил следующую альтернативу, которая имеет тот же эффект cat, но может быть более интуитивно понятной для некоторых пользователей:

psql -U user -d db -c "COPY table FROM STDIN CSV HEADER" < file.csv
...