64

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

任何帮助深表感谢!

4

16 回答 16

139

假设是psql命令行工具,您可以使用\copy而不是copy.

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

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

于 2013-10-19T13:31:38.477 回答
81

将 CSV 文件复制到 /tmp

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

于 2015-04-27T15:31:19.853 回答
23
chmod a+rX /users/darchcruise/ /users/darchcruise/desktop /users/darchcruise/desktop/items_ordered.csv

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

于 2013-10-19T06:43:50.637 回答
15

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

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

于 2017-09-28T20:18:55.060 回答
5

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

也许这对其他人也可能有用。

于 2015-12-14T11:50:12.760 回答
4

另一种方法是,如果您有 pgAdmin 并且习惯于使用 GUI,则转到架构中的表并右键单击要将文件导入到的表并选择“导入”浏览您的计算机以查找文件,选择您的文件类型,您希望将数据估算到的列,然后选择导入。

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

于 2015-07-22T16:42:10.287 回答
2

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

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

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

于 2019-02-07T15:56:05.570 回答
1

对我来说,它可以简单地为 chown 命令添加 sudo (或以 root 身份运行):

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

于 2017-03-03T11:36:35.410 回答
1

万一您在 Windows 10 下遇到此问题,请在安全选项卡上添加用户组“youcomputer\Users”并授予它完全控制权,这解决了我的问题

于 2019-04-28T21:07:19.700 回答
1

对于macbook,我首先打开终端然后输入

open /tmp

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

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

\copy recharge_operator FROM '/private/tmp/operator.csv' DELIMITER ',' CSV;
于 2019-05-01T05:50:43.720 回答
1

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

例子:

GRANT pg_read_server_files TO my_user WITH ADMIN OPTION;
于 2019-08-08T10:54:34.357 回答
1
COPY your table (Name, Latitude, Longitude) FROM 'C:\Temp\your file.csv' DELIMITERS ',' CSV HEADER;

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

于 2020-02-09T15:46:08.387 回答
0

我有相同的错误消息,但psycopg2用于与 PostgreSQL 通信。我通过使用这些函数修复了权限问题,当用户运行 python 脚本copy_from并将copy_expert数据提供给数据库时,它将在客户端打开文件STDIN

有关详细信息,请参阅此链接

于 2019-07-03T12:54:20.623 回答
0

此答案仅适用于 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:执行)

TYPE (1 Char) = d: 目录, -: 文件

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

组权(所有者后 3 个字符)

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

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

x这意味着对于 FILE_PATH,所有目录(home、user、training、sql)都应该在 USER RIGHTS中至少有一个。

  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. 再试一次。

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

于 2020-05-02T07:45:34.570 回答
0

我刚刚将源 csv 文件复制到外部 USB 驱动器,它工作正常。

于 2021-10-25T14:43:18.000 回答
-3

可能是您正在通过连接远程主机使用 pgadmin,然后您正在尝试从您的系统进行更新,但它在远程系统的文件系统中搜索该文件......这是我面临的错误可能也是您检查它

于 2014-03-22T09:48:45.317 回答