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


15

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

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

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

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

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

回答:


29

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

ただ、使用psql内蔵の「S \copyだけで、サーバ側と同じように動作コマンド、COPYしかし、クライアントと使用するクライアント・パスへのワイヤプロトコルを介してコピーを行います。

psqlバックスラッシュコマンドであるため、末尾のセミコロンを省略します。例:

\copy products TO '/tmp/products.csv' CSV DELIMITER ','

参照のためのマニュアルのエントリコマンドコマンドdocumenation詳細については。\copypsqlCOPY

同じようにCOPY使用できる\copy(SELECT ...)(にではなく)データをコピーするときに代わりに、テーブル名のクエリ。


いくつかの限られた状況で役立つ可能性のある一般的に劣る代替手段は、以下を使用することです:

psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'

-oフラグまたはシェル出力リダイレクトを使用して、出力をファイルに書き込みます。ほとんど常に\copyこれに優先して使用する必要があります。


しかし、これはトランザクションを許可しません:(
レザS

ええ、確かにそうです。養うためにヒアドキュメントを使用してpsql始まる、スクリプトをBEGIN、あなたのやって、\copyそれから、コマンドをCOMMIT。またはpsql -f、ヒアドキュメントを使用するのではなく、スクリプトを実行するために使用します。
クレイグリンガー

戻ってきてくれてありがとう...それが私がやったことだし、うまくいった=)
レザS

-A代わりに使用することもできますし、-P format=unalignedあなたが必要だと思う-P fieldsep=,
エヴァンキャロル

2

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

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

1
CSVは生成されず、フォーマットされたテキスト出力が生成されます。-t -P format=unaligned そのコマンドに追加すると、パイプで区切られたバギーCSVのように少し近くになりますが、テキスト内のパイプはエスケープされないため無効になります。
クレイグリンガー

ああ、あなたはまた-P fieldsep=','、これがエスケープの不足のためにエラーを引き起こす可能性が高いことを除いて欲しいでしょう。-P fieldsep_zero=onnullバイトで区切られたテキストの解析を気にしなくても大丈夫です。nullバイトはpsql出力では自然に発生しないためです。
クレイグリンガー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.