将数据从 Excel 导入 PostgreSQL

Posted

技术标签:

【中文标题】将数据从 Excel 导入 PostgreSQL【英文标题】:Import data from Excel to PostgreSQL 【发布时间】:2014-01-09 16:59:47 【问题描述】:

我在 *** 上看到了与我现在问的问题类似/相同的问题,但是在我的情况下我无法解决。

事情是这样的: 我有一个 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 列 第一个和第二个为字符[],最后四个为整数,名称相同,如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

我的问题是:

    我应该在 PostgreSQL 的 allfields 表中创建这些列吗? 是否需要修改 Excel 文件中的其他内容? 为什么会出现“权限被拒绝”错误?

【问题讨论】:

【参考方案1】:
    根据您的文件,前两列都不需要是数组类型(字符[]) - 与 C 字符串不同,postgres 中的“字符”类型 已经是字符串。您可能想让事情变得更简单,而是使用 varchar 作为这两列的类型。 我不认为你这样做。 检查您是否仍然没有在 excel 中打开并锁定该文件 - 如果您在 excel 中执行了“另存为”以从 xlsx 转换为 csv,那么您可能需要在 excel 中关闭该文件。

【讨论】:

@yieldsfalsehodd 创建新列时我正在搜索 varchar,但没有 varchar。无论如何,我按照你的建议让它们成为“角色”。但是仍然收到有关文件权限的相同错误。该文件完全关闭(是的,我通过另存为转换为 .csv)。【参考方案2】:

SQL state: 42501 在 PostgreSQL 中意味着您无权在预期架构中执行此类操作。这个error code list 表明了这一点。

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

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

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

【讨论】:

我检查了所有人...用户拥有所有特权。我还分别将所有公共权限授予了数据库、表和列,同样的错误!【参考方案3】:
    是的,我认为你可以。对于 COPY 命令,有可选的 HEADER 子句。查看 http://www.postgresql.org/docs/9.2/static/sql-copy.html 我不这么认为。使用我的 #1 和 #3,它应该可以工作。 您需要超级用户权限。

【讨论】:

试过类似:从 'C:\filepath\filename.csv' DELIMITER ';' 复制所有字段CSV HEADER 用户也拥有所有权限。我创建了一个新角色并将其设置为超级用户......同样的错误!【参考方案4】:

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

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

2) 我需要修改 Excel 文件中的其他内容吗?

没有。

3) 为什么会出现“权限被拒绝”错误?

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

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

您使用什么作为前端客户端来发出COPY?其他工具有其他方法来完成同样的事情。【参考方案6】:

好的,问题是我需要更改Excel filepath。我将它插入到公共帐户中,所有用户都可以访问它

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

【讨论】:

【参考方案7】:

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

    右键单击包含文件的文件夹并选择属性。 选择属性下的安全标签。 选择编辑 选择添加输入要选择的对象名称字段下,输入Everyone 在所有对话框中单击确定应用(如果已激活) 再次尝试读取文件。

【讨论】:

以上是关于将数据从 Excel 导入 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

将数据从excel导入Python时排除第一行

R 中用于从 Excel 导入数据和将数据导出到 Excel 的强大方法是啥?

使用VB将数据从Excel导入Ms Access

将数据从excel导入SAS

ABAP,怎么将图片从系统导入到EXCEL里?

将数据从 excel 电子表格导入 django 模型