将数据从 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 file
的path
。我将它插入到公共帐户中,所有用户都可以访问它。
如果您遇到同样的问题,请将您的excel file
移动到前C:\\User\Public
文件夹(此文件夹是一个没有任何限制的公用文件夹),否则您必须处理Windows permission issues
。
【讨论】:
【参考方案7】:对于那些出于某种原因不想将他们希望阅读的文件移动到不同位置(公共)的人。这是一个明确的解决方案。
-
右键单击包含文件的文件夹并选择属性。
选择属性下的安全标签。
选择编辑
选择添加
在输入要选择的对象名称字段下,输入Everyone
在所有对话框中单击确定或应用(如果已激活)
再次尝试读取文件。
【讨论】:
以上是关于将数据从 Excel 导入 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章