【问题标题】:Copying data from local .CSV file to pgsql table in remote server将数据从本地 .CSV 文件复制到远程服务器中的 pgsql 表
【发布时间】:2016-10-30 22:33:13
【问题描述】:

我正在尝试将本地计算机上的 csv 文件中的数据复制到名为 states 的远程 pgsql 表中,但我收到一个错误:在“FROM”处或附近出现语法错误。有人可以指导我为什么会收到此错误吗?

   COPY FROM STDIN states FROM '/Users/Shared/data.csv'  DELIMITER AS ',';

【问题讨论】:

  • 将 FROM STDIN 替换为 TO,它应该可以工作。
  • 感谢您的回复,但您的建议无效。
  • 哎呀。删除 TO。它应该是 COPY states FROM '....' DELIMITER AS ',';
  • 如果我将 csv 复制到本地计算机上的表中,您的建议非常有效。我的问题是将 csv 复制到 pgsql 服务器上的表中

标签: postgresql


【解决方案1】:

问题是文件的路径在远程服务器,而不是本地。

您需要 psql 并将文件通过管道传输到 STDIN:

psql -h host -d remoteDB -U myuser -c  "copy states from STDIN with delimiter as ',';" < /path/file.csv

或者你也可以这样做:

cat /path/file.csv | psql -h host -d remoteDB -U myuser -c  "copy states from STDIN with delimiter as ',';"

【讨论】:

  • 感谢您的回答 dmg。但是......文件的路径在我的本地机器上。表“状态”在 pgsql 服务器上。我不确定这是否清楚
  • 抱歉,Michael,我忘记在路径名前添加
  • 啊啊啊,我现在得到 -bash: /Users/Shared/data.csv: No such file or directory。我的 csv 文件位于共享文件夹中。我检查了三倍。
  • 你确定吗?在终端中也这样做: ls /Users/Shared/data.csv 并查看它是否存在。听起来像:要么,它无法读取它,要么它不存在。
  • 我唯一的建议是检查名称的大小写是否相同。您也可以使用: cat /Users/Shared/data.csv | psql -h host -d remoteDB -U myuser -c "从 STDIN 复制状态,分隔符为 ',';"
【解决方案2】:

除非文件位于 Postgres 服务器上,否则您不能直接使用文件名执行此操作。 The docs of COPY state:

带有文件名的COPY 指示PostgreSQL 服务器直接读取或写入文件。服务器必须可以访问该文件,并且必须从服务器的角度指定名称。当指定 STDIN 或 STDOUT 时,数据通过客户端和服务器之间的连接传输。

您必须通过 STDIN 输入文件。

许多 Postgres 驱动程序提供了一种方法来简化此操作。例如,ruby-pg provides copy_data

conn.copy_data "COPY states FROM STDIN FORMAT CSV" do
  File.foreach('/Users/Shared/data.csv') do |line|
    conn.put_copy_data(line)
  end
end

【讨论】:

  • 该文件应该可以被 postgres 客户端访问,文件不必只存在于服务器上。
  • @raj240 也许你想到的是\copy in psql
猜你喜欢
  • 2016-09-13
  • 1970-01-01
  • 2018-09-04
  • 2017-09-15
  • 2014-06-09
  • 2020-05-09
  • 2012-02-17
  • 2020-10-28
  • 2023-01-19
相关资源
最近更新 更多