Ошибка Postgres: не удалось открыть файл для чтения: отказано в разрешении

компьютер: Mac OS X, версия 10.8 Базы Данных: Базы Данных Postgres

попытка импортировать csv-файл в postgres.

pg> copy items_ordered from '/users/darchcruise/desktop/items_ordered.csv' with CSV;
ERROR:  could not open file "/users/darchcruise/desktop/items_ordered.csv" for reading: Permission denied

затем я попробовал

$> chown postgres /users/darchcruise/desktop/items_ordered.csv
chown: /users/darchcruise/desktop/items_ordered.csv: Operation not permitted

и наконец, я попытался

$> ls -l
-rw-r--r--  1 darchcruise  staff      1016 Oct 18 21:04 items_ordered.csv

любая помощь очень ценится!

8 ответов


chmod a+rX /users/darchcruise/ /users/darchcruise/desktop /users/darchcruise/desktop/items_ordered.csv

это изменит права доступа для вашей папки. Обратите внимание, что каждый сможет прочитать файл. Вы не можете использовать chown как пользователя без прав администратора. Также рассмотрим обучение umask для облегчения создания общих файлов.


предполагая, что psql инструмент командной строки, вы можете использовать \copy вместо copy.

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

под капотом \copy реализуется как COPY FROM stdin и принимает те же параметры, что и серверная сторона COPY.


скопируйте файл CSV в /tmp

для меня это решило проблему.


у меня была проблема, когда я пытаюсь экспортировать данные с удаленного сервера на локальный диск. Я не понимал, что SQL copy фактически выполняется на сервере и что он пытается писать в папку на сервере. Вместо этого правильным было использовать \copy который является командой psql, и он записывает в локальную файловую систему, как я ожидал. http://www.postgresql.org/message-id/CAFjNrYsE4Za_KWzmfgN1_-MG7GTw_vpMRxPk=OEjAiLqLskxdA@mail.gmail.com

возможно это может пригодиться и кому-то еще.


другой способ сделать это, если у вас есть pgAdmin и вам удобно использовать GUI, - это перейти к таблице в схеме и щелкнуть правой кнопкой мыши по таблице, в которую вы хотите импортировать файл, и выбрать "импорт". просмотрите свой компьютер для файла, выберите тип файла, столбцы, в которые вы хотите вменить данные, а затем выберите Импорт.

Это было сделано с помощью pgAdmin III и версии 9.4 PostgreSQL


скопируйте CSV-файл в папку / tmp

файлы, названные в команде копирования, считываются или записываются непосредственно сервером, а не клиентским приложением. Поэтому они должны находиться на компьютере сервера баз данных, а не на клиенте, или быть доступны для него. Они должны быть доступны и доступны для чтения или записи пользователем PostgreSQL (ID пользователя, от имени которого работает сервер), а не клиентом. Копировать именование файла разрешено только суперпользователям базы данных, так как это позволяет читать или запись любого файла, к которому у сервера есть права доступа.


для меня это сработало, чтобы просто добавить sudo (или запустить как root) для команды chown:

sudo chown postgres / users/darchcruise/desktop / items_ordered.csv


может быть, вы используете pgadmin, подключив удаленный хост, а затем пытаетесь обновить его из своей системы, но он ищет этот файл в файловой системе удаленной системы... его ошибка wat, с которой я столкнулся, может быть его также для проверки его