2016-10-30 9 views
2

ローカルマシンからcsvファイルのデータをstateという名前のリモートpgsqlテーブルにコピーしようとしていますが、エラーが発生しています: "から"。誰かが私にこのエラーを受け取っている理由を教えてもらえますか?ローカルの.CSVファイルからリモートサーバのpgsqlテーブルにデータをコピー

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

FROM STDINをTOに置き換えるとうまくいくはずです。 – dmg

+0

ご回答いただきありがとうございますが、あなたの提案はうまくいかなかった。 –

+0

oops。 TOを除去する。それはコピー状態から '....' DELIMITER AS '、'; – dmg

答えて

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 ',';" 
+0

あなたの答えdmgありがとうございます。しかし......ファイルへのパスはローカルマシン上にあります。テーブル "states"はpgsqlサーバ上にあります。私はそれが明確であるか分からない –

+0

私は* psqlを得る:警告:余分なコマンドライン引数* –

+0

申し訳ありませんマイケル、私はパス名の前に<を追加することを忘れました。 – dmg

0

あなたはファイル名で直接それを行うことはできませんPostgresサーバー。 The docs of COPY state

COPY with a file name instructs the PostgreSQL server to directly read from or write to a file. The file must be accessible to the server and the name must be specified from the viewpoint of the server. When STDIN or STDOUT is specified, data is transmitted via the connection between the client and the server.

ファイルを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 
関連する問題