将数据从Excel导入PostgreSQL

时间:2014-01-09 16:59:47

标签: sql database excel postgresql

我在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

我的问题是:

  1. 我应该在PostgreSQL的allfields表中创建这些列吗?
  2. 我是否必须修改Excel文件中的任何其他内容?
  3. 为什么我得到'拒绝许可'错误?

7 个答案:

答案 0 :(得分:1)

  1. 根据您的文件,前两列都不需要是数组类型(字符[]) - 与C字符串不同,postgres 中的“字符”类型已经是字符串。您可能希望简化操作,并使用varchar作为这两列的类型。
  2. 我认为你不这样做。
  3. 检查您是否仍然打开该文件并将其锁定在Excel中 - 如果您执行了“另存为”以从excel中将xlsx转换为csv,那么您可能需要在excel中关闭该文件。

答案 1 :(得分:1)

PostgreSQL中的

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

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

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

  

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

答案 2 :(得分:0)

  1. 是的,我认为你可以。对于COPY命令,有可选的HEADER子句。校验 http://www.postgresql.org/docs/9.2/static/sql-copy.html
  2. 我不这么认为。使用我的#1和#3,它应该可以工作。
  3. 您需要获得超级用户许可。

答案 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)

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

  1. 右键单击包含该文件的文件夹,然后选择属性
  2. 选择属性下的安全标签。
  3. 选择修改
  4. 选择添加
  5. 字段下输入要选择的对象名称,输入所有人
  6. 点击确定到所有对话框,或应用(如果已激活)
  7. 再次尝试阅读该文件。