web-dev-qa-db-ja.com

CSVデータをPostgreSQLデータベース(リモートデータベース)に挿入する方法

CSVファイルがあります。ファイルがデータベースと同じサーバー上にある場合、以下のコマンドを使用して、データベースにデータを挿入できます。

psql -h localhost -d local_mydb -U myuser -c "copy mytable (column1, column2)  from '/path/to/local/file.csv' with delimiter as ','"

ただし、ファイルはローカルサーバーにあり、データベースは別の(リモート)サーバーにあります。

以下のコマンドを使用して、リモートサーバーでこれを実行しようとすると、

psql -h remotehost -d remote_mydb -U myuser -c "copy mytable (column1, column2)  from '/path/to/local/file.csv' with delimiter as ','"

許可拒否の例外が発生します。

スーパーユーザー特権なしで、ローカルファイルからリモートサーバー上のデータベースにデータを挿入するにはどうすればよいですか?

18
Spike

\copy(バックスラッシュに注意)を使用すると、リモートデータベースとの間でコピーを行うことができ、スーパーユーザー権限は不要です。

psql -h remotehost -d remote_mydb -U myuser -c "\copy mytable (column1, column2)  from '/path/to/local/file.csv' with delimiter as ','"

Javaを使用している場合は、JDBCドライバーでCopyManagerを使用できます。 https://jdbc.postgresql.org/documentation/publicapi/org/postgresql/copy/CopyManager.html

27
Neil McGuigan

STDIN経由でファイルをフィードできます。 PostgreSQL COPYドキュメント ...

STDINまたはSTDOUTが指定されている場合、データはクライアントとサーバー間の接続を介して送信されます。

psql -h remotehost -d remote_mydb -U myuser -c \
    "copy mytable (column1, column2) from STDIN with delimiter as ','" \
    < /path/to/local/file.csv

FROM PROGRAMの使用について間違っていました。 FROM 'filename'と同じ注意事項があります。サーバーはクライアントではなくプログラムを実行します。

PROGRAMを指定すると、serverは指定されたコマンドを実行し、プログラムの標準出力から読み取るか、プログラムの標準入力に書き込みます。コマンドは、サーバーの観点から指定する必要があり、PostgreSQLユーザーが実行できる必要があります。

16
Schwern