计算机: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
非常感谢任何帮助!
答案 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_from
和copy_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
在终端内部查看文件/文件夹的权限,您需要通过输入命令ls -l
将它们列出来。
输出中有一段显示了某样内容-> drwxrwxr-x
可以通过以下方式进行解释:
TYPE |所有权|集团权利|用户权利
rwx
(r:读取,W:写入,X:执行)
TYPE(1个字符)= d:目录,-:文件
所有者权利(TYPE后为3个字符)
组权限(所有者拥有3个字符)
用户权利(组后3个字符)
x
。这意味着对于FILE_PATH,所有目录(home,user,training,sql)的用户权限中至少应有一个x
。
x
所需输入的所有父文件夹的权限。您可以使用chmod rights_you_want parent_folder
假设/training/
没有执行权限。
我要转到用户文件夹并输入chmod a+x training
w
。或至少r
(如果您想阅读)假设/sql
没有写权限。
我现在chmod a+w sql
sudo systemctl restart postgresql
这很可能会帮助您现在获得成功的预期结果。
答案 14 :(得分:-3)
可能是你正在使用pgadmin通过连接远程主机然后U正在尝试从你的系统更新那里但它在远程系统的文件系统中搜索该文件...它我遇到的错误我可能也是你的检查它