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

Любая помощь высоко ценится!

19 ответов

Решение
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

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

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

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

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

Возможно, это может быть полезно и кому-то еще.

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

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

Для MacBook сначала я открыл терминал, а затем введите

open /tmp

или в каталоге поиска вы напрямую вводите команду +shift+g, затем набираете /tmp и переходите в папку.

он открывает временную папку в Finder. Затем я вставляю скопированный файл CSV в эту папку. Затем я снова захожу в терминал postgres и набираю команду ниже, а затем она копирует мои данные CSV в таблицу БД.

\copy recharge_operator FROM '/private/tmp/operator.csv' DELIMITER ',' CSV;

Я решил ту же проблему с помощью рекурсивного chown для родительской папки:

sudo chown -R postgres:postgres /home/my_user/export_folder

(мой экспорт находится в /home/my_user/export_folder/export_1.csv)

COPY your table (Name, Latitude, Longitude) FROM 'C:\Temp\your file.csv' DELIMITERS ',' CSV HEADER;

Использовать c:\Temp\"Your File"\.

Вы должны предоставить pg_read_server_files разрешение пользователю, если вы не используете postgres superuser.

Пример:

GRANT pg_read_server_files TO my_user WITH ADMIN OPTION;

Я просто скопировал исходный CSV-файл на внешний USB-накопитель, и он работал нормально.

Просто на случай, если вы столкнетесь с этой проблемой под Windows 10, добавьте группу пользователей "youcomputer\Users" на вкладке безопасности и предоставьте ей полный контроль, что решило мою проблему

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

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

В Mac сделал следующее

открыть /tmp из терминала

Папка /tmp открывается в Finder

Файл данных .csv скопирован вручную в /tmp.

Запустите команду из инструмента запросов. КОПИРОВАТЬ имя таблицы FROM '/private/tmp/employee.csv' DELIMITER ',' CSV ЗАГОЛОВОК;

В Linux вы можете исправить это, указавpostgresправа пользователя на чтение/запись/выполнение в целевом каталоге. Например:

      setfacl -m u:postgres:rwx /home/hi

У меня было такое же сообщение об ошибке, но я использовал psycopg2общаться с PostgreSQL. Я исправил проблемы с разрешениями, используя функцииcopy_from а также copy_expert который откроет файл на стороне клиента как пользователь, запускающий скрипт python, и передаст данные в базу данных через STDIN.

Обратитесь к этой ссылке для получения дополнительной информации.

Этот ответ предназначен только для начинающих пользователей Linux.

Предполагая, что изначально у пользователя БД не было разрешения на файл / папку (каталог) на стороне клиента.

Ограничимся следующим:

Пользователь: postgres

Цель: вы хотели (писать в / читать) конкретную папку

Орудие труда: psql

Подключено к конкретной базе данных: YES

ПУТЬ К ФАЙЛУ: /home/user/training/sql/csv_example.csv

Запрос: \copy (SELECT * FROM table_name TO FILE_PATH, DELIMITER ',' CSV HEADER;

Фактические результаты: после выполнения запроса вы получили сообщение об ошибке: Permission Denied

Ожидаемые результаты: COPY COUNT_OF_ROWS_COPIED

Вот шаги, которые я предпринял, чтобы попытаться решить эту проблему.

  1. Подтвердите разрешения FILE_PATH в вашей файловой системе.

Внутри терминала, чтобы просмотреть разрешения для файла / папки, вам необходимо их длинный список, введя команду ls -l.

На выходе есть раздел, который показывает что-то вроде этого -> drwxrwxr-xЧто интерпретируется следующим образом:

ТИП | ПРАВА ВЛАДЕЛЬЦА | ПРАВА ГРУППЫ | ПРАВА ПОЛЬЗОВАТЕЛЯ

rwx (r: чтение, W: запись, X: выполнение)

ТИП (1 символ) = d: каталог, -: файл

ПРАВА ВЛАДЕЛЬЦА (3 символа после ТИПА)

ПРАВА ГРУППЫ (3 символа после ВЛАДЕЛЬЦА)

ПРАВА ПОЛЬЗОВАТЕЛЯ (3 символа после ГРУППЫ)

  1. Если разрешений недостаточно (убедитесь, что пользователь может, по крайней мере, ввести все папки по указанному вами пути) - x.

Это означает, что для FILE_PATH все каталоги (домашний, пользовательский, обучающий, sql) должны иметь как минимум x в ПРАВАХ ПОЛЬЗОВАТЕЛЯ.

  1. Измените разрешения для всех родительских папок, которые вам нужно ввести, чтобы иметь x. Вы можете использоватьchmod rights_you_want parent_folder

Предполагая /training/ не было разрешения на выполнение.

Я бы пошел в папку пользователя и ввел chmod a+x training

  1. Измените папку / каталог назначения, чтобы wесли вы хотите написать ему. или по крайней мереr если ты хочешь читать оттуда

Предполагая /sql не было разрешения на запись.

Я бы сейчас chmod a+w sql

  1. Перезагрузите сервер postgresql sudo systemctl restart postgresql
  2. Попробуй снова.

Скорее всего, это поможет вам получить ожидаемый результат.

Я боролся с этим уже пару часов. Если вы пользователь Windows, попробуйте переместить файл в «C:\Users\Public».

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

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