将数据从Excel导入PostgreSQL

问题描述 投票:1回答:7

我已经看到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

My questions are:

  1. 我应该在PostgreSQL的allfields表中创建这些列吗?
  2. 我是否必须修改Excel文件中的任何其他内容?
  3. 为什么我得到这个“许可被拒绝”的错误?
sql database excel postgresql
7个回答
1
投票
  1. 根据您的文件,前两列都不需要是数组类型(字符[]) - 与C字符串不同,postgres中的“字符”类型已经是一个字符串。您可能希望简化操作并使用varchar作为这两列的类型。
  2. 我不认为你这样做。
  3. 检查您是否仍然打开该文件并将其锁定在Excel中 - 如果您执行了“另存为”以从excel中将xlsx转换为csv,那么您可能需要在excel中关闭该文件。

1
投票

SQL状态:PostgreSQL中的42501表示您无权在预期的架构中执行此类操作。这个error code list表明了这一点。

检查您是否指向正确的架构,并且您的用户具有足够的权限。

Documentation also states您需要在原始表上选择权限并在目标表上插入权限。

您必须对其值由COPY TO读取的表具有select权限,并对通过COPY FROM插入值的表插入权限。在命令中列出的列上具有列权限就足够了。


0
投票
  1. 是的我认为你可以。对于COPY命令,有可选的HEADER子句。检查http://www.postgresql.org/docs/9.2/static/sql-copy.html
  2. 我不这么认为。对于我的#1和#3,它应该有效。
  3. 您需要超级用户权限。

0
投票

1)我应该在PostgreSQL的allfields表中创建那些列吗?

使用text作为字符字段。在任何情况下都不是数组,如@yieldsfalsehood pointed out correctly

2)我是否必须修改Excel文件中的任何其他内容?

没有。

3)为什么我得到这个'允许拒绝'错误?

您的系统用户postgres(或者您正在运行postgres服务器的用户)可以访问该文件。 Per documentation:

带有文件名的COPY指示PostgreSQL服务器直接读取或写入文件。该文件必须可供服务器访问,并且必须从服务器的角度指定名称。

数据库用户的权限不是问题的原因。但是(引用同一页):

COPY命名文件或命令只允许数据库超级用户,因为它允许读取或写入服务器有权访问的任何文件。


0
投票

关于权限问题,如果您使用psql发出COPY命令,请尝试使用\copy


0
投票

好的问题是我需要改变pathExcel file。我将其插入公共帐户,所有用户都可以访问它。

如果您遇到同样的问题,请将您的excel file移至ex C:\\User\Public文件夹(此文件夹是没有任何限制的公共文件夹),否则您必须处理Windows permission issues


0
投票

对于那些由于某种原因不希望将他们希望阅读的文件移动到其他位置(公共)的人。这是一个明确的解决方案。

  1. 右键单击包含该文件的文件夹,然后选择属性。
  2. 选择属性下的“安全”选项卡。
  3. 选择编辑
  4. 选择添加
  5. 在字段下输入要选择的对象名称,键入Everyone
  6. 对所有对话框单击“确定”,或者如果激活则单击“应用”
  7. 尝试再次阅读该文件。
热门问题
推荐问题
最新问题