web-dev-qa-db-ja.com

ローカルPostgresテーブルをローカルマシンのCSVファイルにエクスポートする

リモートサーバー上のデータベースへの読み取り専用アクセス権があります。だから、私は実行することができます:

COPY products TO '/tmp/products.csv' DELIMITER ',';

しかし、そのサーバーではファイルを作成/保存する権限がないので、ローカルマシンでこれを行う必要があります。

リモートデータベースに接続するときに、リモートサーバーではなくローカルマシンにファイルを保存するコマンドを実行するにはどうすればよいですか?

または、Linuxコマンドを実行してリモートデータベースに接続し、クエリを実行して、出力をローカルマシンにファイルとして保存するにはどうすればよいですか?

18
tasmaniski

すでに提案されている両方のアプローチは、不必要に複雑であるように見えます。

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を使用する必要があります。

30
Craig Ringer

Linuxコマンドは次のとおりです。

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'
2
tasmaniski