【问题标题】:Postgres: \copy syntaxPostgres:\复制语法
【发布时间】:2021-09-14 05:01:17
【问题描述】:

在 CentOS 7 上使用 PostgreSQL 9.5,我创建了一个名为 sample 的数据库以及几个表。每个表的/home/MyUser/data 中都有.csv 数据。 例如,表"TableName" 存在TableName.csv

如何将 csv 文件加载到每个表中?


我尝试过的方法不起作用,我无法弄清楚我做错了什么。

从数据库中加载

$ psql sample

sample=# COPY "TableName" FROM '/home/MyUser/data/TableName.csv' WITH CSV;

ERROR:  could not open file "/home/MyUser/data/TableName.csv" for reading: Permission denied

这意味着文件权限问题。 data/ 中的所有文件都是-rw-r--r--,目录本身是drwxr-xr-x。所以文件权限不应该是问题(除非我遗漏了什么)。网上说COPY有权限问题,试试\copy

从 CLI 加载

$ psql \copy sample FROM /home/MyUser/data/TableName.csv WITH CSV

psql: warning: extra command-line argument "FROM" ignored
psql: warning: extra command-line argument "/home/MyUser/data/TableName.csv" ignored
psql: warning: extra command-line argument "WITH" ignored
psql: warning: extra command-line argument "CSV" ignored
psql: FATAL:  Peer authentication failed for user "sample"

这似乎是一个语法错误,但我没有发现文档特别有用(man psql 然后是/\copy)。我也尝试了以下相同的结果。

$ psql \copy sample."TableName" FROM /home/MyUser/data/TableName.csv WITH CSV
$ psql \copy sample FROM /home/MyUser/data/TableName.csv WITH DELIMITER ','

还有其他几种排列会产生类似的错误。

使用的网络资源

【问题讨论】:

  • 尝试psql>\copy "TableName" FROM '/home/MyUser/data/TableName.csv' WITH CSV;,如果您再次遇到权限错误,请确保您的 unix 用户可以读取该文件
  • 使用$ psql -c '\copy ...'

标签: postgresql


【解决方案1】:

关于权限:

不要忘记,要访问文件,您需要对路径中的所有目录具有权限。因此,例如,如果操作系统用户 postgres 没有 /home/MyUser 目录的权限,您会收到观察到的错误消息。

关于\copy

您必须使用-c 选项向psql 提供命令:

$ psql -c "\copy sample FROM '/home/MyUser/data/TableName.csv' WITH (FORMAT CSV)"

【讨论】:

    【解决方案2】:

    补充一点,这个示例对 Laurenz 很有帮助,因为我今天第一次在 Windows 10 客户端上使用它。

    我的目标是企业 greenplum db(同样的东西只是并行/扩展)。

    第 1 步,安装 Postgres 客户端(我没有安装数据库本身,但所有其他项目作为 Windows 捆绑安装的一部分,包括最重要的外壳) https://www.postgresql.org/download/

    第 2 步,在工作空间/数据库上创建目标表。我使用 DBeaver 连接到 greenplum db,然后运行它,您不必使用 DBeaver,您可能可以在 shell 本身中运行它。 CREATE TABLE 工作区名称.scott_test2 ( blah1 varchar(40) 非空, blah2 varchar(40) 非空 ) 分发者 (blah1);

    第 3 步,从之前安装的 postgres 实用程序启动 shell 命令,按照提示登录,然后当你进入时,我在上面安装的 shell(命令行界面)中运行的命令很简单: \copy workspacename.scott_test2 FROM 'C:\temp\flatfile.csv' WITH CSV;

    注意 \copy 不是复制。使用\复制

    这在 2 秒内加载了 50 万行表,速度很快。上面的文件是逗号分隔的,带有 CSV 的就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2014-05-16
      相关资源
      最近更新 更多