Нет такого файла или каталога, когда мы определяем путь как '~ / path / to / csv' в postgres - PullRequest
0 голосов
/ 19 октября 2018
lease=# COPY dhcpd_data (ip_address, start_time, end_time, mac_address, machine_name) FROM '~/outputcsvre.csv' DELIMITER ',' CSV HEADER;
ERROR:  could not open file "~/outputcsvre.csv" for reading: No such file or directory

, если я определяю путь как '/home/rihiraj12/outputcsvre.csv', он отлично работает.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

~ - это ярлык, который unix-подобные оболочки могут быть расширены, чтобы стать домашним каталогом вашего пользователя.т. е. если вы используете ~/outputcsvre.csv, оболочка преобразует это в /home/rihiraj12/outputcsvre.csv, прежде чем делать с ней что-либо еще.

За пределами оболочки приложения редко реализуют это расширение - как и postgresql, поэтому вы должны предоставить реальныйпуть к файлу.

В случае команды COPY в postgresql она выполняется сервером - поэтому в этом случае вам нужно будет указать имя файла, которое сервер может разрешить и прочитать напрямую.(то есть относительный путь будет относительно того, где расположен сервер postgresql, поэтому используйте абсолютный путь к файлу.)

0 голосов
/ 19 октября 2018

Да, это нормально.

На самом деле у вас нет каталога с именем ~.Когда вы выполняете команду в командной строке, оболочка расширится от ~ до /home/rihiraj12 перед запуском программы.Но здесь вы не используете оболочку, поэтому ~ интерпретируется буквально.

В качестве обходного пути вы можете сказать

COPY dhcpd_data (...) FROM PROGRAM 'cat ~/outputcsvre.csv' ...

Но обратите внимание, что команда COPY выполняется командойсервер, так что это заставит сервер порождать команду cat и использовать домашний каталог сервера PostgreSQL.

Чтобы указать файл с вашей собственной точки зрения, вы можете (в psql) использовать\copy мета-команда (которая имеет тот же синтаксис, что и COPY):

\copy dhcpd_data (...) FROM PROGRAM 'cat ~/outputcsvre.csv' ...

Это будет использовать ваш собственный домашний каталог как ~.

...