承認された回答の解決策はサーバー上でのみ機能し、クエリを実行するユーザーには、このSO回答で説明されているようにファイルを読み取る権限があります。
それ以外の場合、より柔軟なアプローチは、SQLのCOPY
を置き換えることです。 psql
を使用したコマンド \copy
と呼ばれるの「メタコマンド」 これは「実際の」COPYとすべて同じオプションを取りますが、クライアント内で実行されます(;
は必要ありません)。 最後に):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
ドキュメントによると、\copy
コマンド:
フロントエンド(クライアント)コピーを実行します。これはSQLCOPYコマンドを実行する操作ですが、サーバーが指定されたファイルを読み書きする代わりに、psqlはファイルを読み書きし、サーバーとローカルファイルシステム間でデータをルーティングします。つまり、ファイルのアクセス可能性と権限はサーバーではなくローカルユーザーのものであり、SQLスーパーユーザーの権限は必要ありません。
さらに、the_file.csv
最初の行にヘッダーが含まれています。header
を追加することで認識できます。 上記のコマンドの最後に:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"