Postgres ERROR:无法打开文件进行阅读:权限被拒绝

时间:2013-10-19 06:20:10

标签: postgresql

计算机: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

非常感谢任何帮助!

15 个答案:

答案 0 :(得分:110)

假设使用psql命令行工具,您可以使用\copy代替copy

\copy打开文件并将内容提供给服务器,而copy告诉服务器打开文件本身并读取它,这可能是许可方面的问题,甚至是不可能的客户端和服务器在不同的机器上运行,中间没有文件共享。

在幕后,\copy实现为COPY FROM stdin,并接受与服务器端COPY相同的选项。

答案 1 :(得分:50)

将CSV文件复制到/ tmp

对我来说,这解决了这个问题。

答案 2 :(得分:13)

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

这将更改您文件夹的访问权限。请注意,每个人都可以阅读您的文件。 如果没有管理权限,则不能将chown用作用户。 另请考虑学习umask以简化共享文件的创建。

答案 3 :(得分:8)

将CSV文件复制到/ tmp文件夹

COPY命令中指定的文件由服务器直接读取或写入,而不是由客户端应用程序读取或写入。因此,它们必须驻留在数据库服务器计算机上,或者可以访问它们,而不是客户端。它们必须是PostgreSQL用户(服务器运行的用户ID)可访问,可读或可写,而不是客户端。 COPY命名文件只允许用于数据库超级用户,因为它允许读取或写入服务器有权访问的任何文件。

答案 4 :(得分:5)

当我尝试将数据从远程服务器导出到本地磁盘时,我遇到了问题。我没有意识到SQL copy实际上是在服务器上执行的,并且它试图写入服务器文件夹。相反,正确的做法是使用\copy这是psql命令,它按照我的预期写入本地文件系统。 http://www.postgresql.org/message-id/CAFjNrYsE4Za_KWzmfgN1_-MG7GTw_vpMRxPk=OEjAiLqLskxdA@mail.gmail.com

也许这对其他人也有用。

答案 5 :(得分:2)

另一种方法是,如果你有pgAdmin并且习惯使用GUI就是去模式中的表格并右键单击要导入文件的表格并选择"导入"浏览计算机以查找文件,选择文件类型,要将数据插入的列,然后选择导入。

这是使用pgAdmin III和9.4版本的PostgreSQL

完成的

答案 6 :(得分:1)

对我而言,只需为chown命令添加sudo(或以root身份运行):

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

答案 7 :(得分:0)

我在父文件夹上使用递归chown解决了相同的问题:

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

(我的出口在/home/my_user/export_folder/export_1.csv中)

答案 8 :(得分:0)

以防万一,如果您在Windows 10下遇到此问题,请在“安全性”选项卡上添加用户组“ youcomputer \ Users”,并授予其完全控制权,即可解决我的问题

答案 9 :(得分:0)

对于Macbook,我首先打开终端,然后键入

open /tmp

或在finder目录中,直接输入command + shift + g,然后在/ tmp中进入文件夹。

它在finder中打开临时文件夹。然后我将复制的csv文件粘贴到此文件夹中。然后再次进入postgres终端并在命令下方键入,然后将我的csv数据复制到db表中

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

答案 10 :(得分:0)

我有相同的错误消息,但是正在使用psycopg2与PostgreSQL通信。我使用功能copy_fromcopy_expert解决了权限问题,这些功能将以运行python脚本的用户身份在客户端打开文件,并通过STDIN将数据提供给数据库。

有关更多信息,请参见this link

答案 11 :(得分:0)

如果您不使用pg_read_server_files postgres,则必须向用户授予superuser权限。

示例:

GRANT pg_read_server_files TO my_user WITH ADMIN OPTION;

答案 12 :(得分:0)

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

使用c:\Temp\"Your File"\

答案 13 :(得分:0)

此答案仅适用于Linux初学者。

假设最初,数据库用户在客户端没有文件/文件夹(目录)权限。

让我们限制以下各项:

用户:postgres

目的:您想要(写入/读取)特定文件夹

工具:psql

已连接到特定的数据库:YES

FILE_PATH:/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 可以通过以下方式进行解释:

TYPE |所有权|集团权利|用户权利

rwx(r:读取,W:写入,X:执行)

TYPE(1个字符)= d:目录,-:文件

所有者权利(TYPE后为3个字符)

组权限(所有者拥有3个字符)

用户权利(组后3个字符)

  1. 如果权限不够(请确保用户至少可以在所需路径中输入所有文件夹)-x

这意味着对于FILE_PATH,所有目录(home,user,training,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. 再试一次。

这很可能会帮助您现在获得成功的预期结果。

答案 14 :(得分:-3)

可能是你正在使用pgadmin通过连接远程主机然后U正在尝试从你的系统更新那里但它在远程系统的文件系统中搜索该文件...它我遇到的错误我可能也是你的检查它