我在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
表中创建这些列吗?答案 0 :(得分:1)
varchar
作为这两列的类型。答案 1 :(得分:1)
SQL状态:42501 表示您无权在预期的架构中执行此类操作。这个error code list显示了这一点。
检查您是否指向正确的架构,并且您的用户具有足够的权限。
Documentation also states您需要在原始表上选择权限并在目标表上插入权限。
您必须对读取其值的表具有select权限 COPY TO,并在值所在的表上插入权限 由COPY FROM插入。只有列权限就足够了 命令中列出的列。
答案 2 :(得分:0)
答案 3 :(得分:0)
1)我应该在PostgreSQL的allfields表中创建那些列吗?
使用text
作为字符字段。在任何情况下都不是数组,如@yieldsfalsehood pointed out correctly。
2)我是否必须修改Excel文件中的任何其他内容?
没有
3)为什么我得到“允许拒绝”错误?
您的系统用户postgres
(或者您正在运行postgres服务器的用户)可以访问该文件。 Per documentation:
带有文件名的
COPY
指示PostgreSQL服务器直接读取 来自或写入文件。该文件必须可供服务器访问 必须从服务器的角度指定名称。
数据库用户的权限不是问题的原因。但是(引用同一页):
COPY
仅允许数据库超级用户命名文件或命令, 因为它允许读取或写入服务器有权访问的任何文件。
答案 4 :(得分:0)
关于权限问题,如果您使用psql发出COPY
命令,请尝试改为使用\copy
。
答案 5 :(得分:0)
好的问题是我需要更改path
的{{1}}。我将其插入公共帐户,其中所有用户都可以访问。
如果您遇到同样的问题,请将Excel file
移至ex excel file
文件夹(此文件夹是公共文件夹,没有任何限制),否则您必须处理C:\\User\Public
。
答案 6 :(得分:0)
对于那些由于某种原因不希望将他们希望阅读的文件移到其他位置(公共)的人。这是一个明确的解决方案。