我正在尝试将来自本地计算机的csv文件中的数据复制到名为states的远程pgsql表中,但是我收到错误:“FROM”或其附近的语法错误。有人可以指导我为什么收到这个错误吗?
COPY FROM STDIN states FROM '/Users/Shared/data.csv' DELIMITER AS ',';
答案 0 :(得分:2)
问题是文件的路径是在远程服务器中,而不是本地路径。
你需要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 ',';"
答案 1 :(得分:0)
除非文件位于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