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
Файлы, названные в команде 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
Вот шаги, которые я предпринял, чтобы попытаться решить эту проблему.
- Подтвердите разрешения FILE_PATH в вашей файловой системе.
Внутри терминала, чтобы просмотреть разрешения для файла / папки, вам необходимо их длинный список, введя команду ls -l
.
На выходе есть раздел, который показывает что-то вроде этого -> drwxrwxr-x
Что интерпретируется следующим образом:
ТИП | ПРАВА ВЛАДЕЛЬЦА | ПРАВА ГРУППЫ | ПРАВА ПОЛЬЗОВАТЕЛЯ
rwx
(r: чтение, W: запись, X: выполнение)
ТИП (1 символ) = d: каталог, -: файл
ПРАВА ВЛАДЕЛЬЦА (3 символа после ТИПА)
ПРАВА ГРУППЫ (3 символа после ВЛАДЕЛЬЦА)
ПРАВА ПОЛЬЗОВАТЕЛЯ (3 символа после ГРУППЫ)
- Если разрешений недостаточно (убедитесь, что пользователь может, по крайней мере, ввести все папки по указанному вами пути) -
x
.
Это означает, что для FILE_PATH все каталоги (домашний, пользовательский, обучающий, sql) должны иметь как минимум x
в ПРАВАХ ПОЛЬЗОВАТЕЛЯ.
- Измените разрешения для всех родительских папок, которые вам нужно ввести, чтобы иметь
x
. Вы можете использоватьchmod rights_you_want parent_folder
Предполагая /training/
не было разрешения на выполнение.
Я бы пошел в папку пользователя и ввел chmod a+x training
- Измените папку / каталог назначения, чтобы
w
если вы хотите написать ему. или по крайней мереr
если ты хочешь читать оттуда
Предполагая /sql
не было разрешения на запись.
Я бы сейчас chmod a+w sql
- Перезагрузите сервер postgresql
sudo systemctl restart postgresql
- Попробуй снова.
Скорее всего, это поможет вам получить ожидаемый результат.
Я боролся с этим уже пару часов. Если вы пользователь Windows, попробуйте переместить файл в «C:\Users\Public».
Может быть, вы используете pgadmin, подключив удаленный хост, затем U пытается обновить его из вашей системы, но он ищет этот файл в файловой системе удаленной системы... Это ошибка, с которой я столкнулся. Может быть, это также для вас проверить его