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 ','"
許可拒否の例外が発生します。
スーパーユーザー特権なしで、ローカルファイルからリモートサーバー上のデータベースにデータを挿入するにはどうすればよいですか?
\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
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ユーザーが実行できる必要があります。