我已经看到stackoverflow上的问题与我现在要求的问题类似/相同,但是我无法在我的情况下解决它。
事情就是这样:我有一个excel电子表格(.xlsx),我用逗号分隔值(.CSV)转换,正如在一些答案中所说:
我的excel文件看起来像这样:
--------------------------------------------------
name | surname | voteNo | VoteA | VoteB | VoteC
--------------------------------------------------
john | smith | 1001 | 30 | 154 | 25
--------------------------------------------------
anothe| person | 1002 | 430 | 34 | 234
--------------------------------------------------
other | one | 1003 | 35 | 154 | 24
--------------------------------------------------
john | smith | 1004 | 123 | 234 | 53
--------------------------------------------------
john | smith | 1005 | 23 | 233 | 234
--------------------------------------------------
在PostgreSQL中,我创建了一个名为allfields
的表,创建了6列第1列和第2列作为字符[],最后4列作为整数,其名称与excel表中所示相同(name, surname, voteno, votea, voteb, votec)
现在我这样做:
copy allfields from 'C:\Filepath\filename.csv';
但是我收到了这个错误:
could not open file "C:\Filepath\filename.csv" for reading: Permission denied SQL state: 42501
allfields
表中创建这些列吗?varchar
作为这两列的类型。SQL状态:PostgreSQL中的42501表示您无权在预期的架构中执行此类操作。这个error code list表明了这一点。
检查您是否指向正确的架构,并且您的用户具有足够的权限。
Documentation also states您需要在原始表上选择权限并在目标表上插入权限。
您必须对其值由COPY TO读取的表具有select权限,并对通过COPY FROM插入值的表插入权限。在命令中列出的列上具有列权限就足够了。
1)我应该在PostgreSQL的allfields表中创建那些列吗?
使用text
作为字符字段。在任何情况下都不是数组,如@yieldsfalsehood pointed out correctly。
2)我是否必须修改Excel文件中的任何其他内容?
没有。
3)为什么我得到这个'允许拒绝'错误?
您的系统用户postgres
(或者您正在运行postgres服务器的用户)可以访问该文件。 Per documentation:
带有文件名的
COPY
指示PostgreSQL服务器直接读取或写入文件。该文件必须可供服务器访问,并且必须从服务器的角度指定名称。
数据库用户的权限不是问题的原因。但是(引用同一页):
COPY
命名文件或命令只允许数据库超级用户,因为它允许读取或写入服务器有权访问的任何文件。
关于权限问题,如果您使用psql发出COPY
命令,请尝试使用\copy
。
好的问题是我需要改变path
的Excel file
。我将其插入公共帐户,所有用户都可以访问它。
如果您遇到同样的问题,请将您的excel file
移至ex C:\\User\Public
文件夹(此文件夹是没有任何限制的公共文件夹),否则您必须处理Windows permission issues
。
对于那些由于某种原因不希望将他们希望阅读的文件移动到其他位置(公共)的人。这是一个明确的解决方案。