リモートサーバー上のデータベースへの読み取り専用アクセス権があります。だから、私は実行することができます:
COPY products TO '/tmp/products.csv' DELIMITER ',';
しかし、そのサーバーではファイルを作成/保存する権限がないので、ローカルマシンでこれを行う必要があります。
リモートデータベースに接続するときに、リモートサーバーではなくローカルマシンにファイルを保存するコマンドを実行するにはどうすればよいですか?
または、Linuxコマンドを実行してリモートデータベースに接続し、クエリを実行して、出力をローカルマシンにファイルとして保存するにはどうすればよいですか?
すでに提案されている両方のアプローチは、不必要に複雑であるように見えます。
psql
の組み込み\copy
コマンドを使用するだけです。これは、サーバー側のCOPY
と同じように機能しますが、ワイヤープロトコルを介してクライアントにコピーし、クライアントパスを使用します。
psql
のバックスラッシュコマンドなので、末尾のセミコロンを省略します。例:
\copy products TO '/tmp/products.csv' CSV DELIMITER ','
詳細については、 psql
コマンドのマニュアルの\copy
エントリ および COPY
コマンドのドキュメント を参照してください。
COPY
と同様に、データを(ではなく)コピーするときに、テーブル名の代わりに\copy
クエリで(SELECT ...)
を使用できます。
いくつかの限られた状況で役立つことができる一般的に劣った代替手段を使用することです:
psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'
-o
フラグまたはシェル出力リダイレクトを使用して、出力をファイルに書き込みます。ほとんどの場合、これに優先して\copy
を使用する必要があります。
Linuxコマンドは次のとおりです。
psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'