Postgresqlの見出しを含むCSVとしてテーブルをエクスポートする方法


418

コマンドラインを使用して、見出しのあるPostgreSQLテーブルをCSVファイルにエクスポートしようとしていますが、CSVファイルにエクスポートできますが、見出しはありません。

私のコードは次のようになります:

COPY products_273 to '/tmp/products_199.csv' delimiters',';

postgres> = 8.1を使用していますか?
Dana the Sane

1
私は新しいバージョンにアップグレードする計画を立てると思います。人生がとても簡単になります
Elitmiar

回答:


595
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

マニュアルに記載されています


7
HEADER引数は8.1まで導入されなかったことに注意してください。
Dana the Sane

7
これは、ちょっとさびたとしましょう。
Milen A. Radev

65
注:COPY管理者権限が必要です。\COPY問題が発生した場合は、代わりに使用してください。
2014年

5
これにより、「DELIMITER '、'」よりも「FORMAT csv」を使用した方が適切な出力が得られなくなります。到着したバージョンがわからない
grahamrhay 2015

37
v9.5の場合、コマンドはCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
次のとおり

223

psqlコマンドラインから:

\COPY my_table TO 'filename' CSV HEADER

最後にセミコロンはありません。


22
COPYコマンドが管理者アクセスを必要とするため、このバージョンは断然最高です
Matthew O'Riordan

2
また、このpsqlアプローチでは、アクセスできる場所であればどこにでも出力を保存できます。私はpsqlアプローチを使用して、リモートサーバーからローカルファイルにデータを取得しました。とても滑らかです。
Ian Gow 2014

特に、アクセス権はあるが、postgresユーザーがアクセスできないディレクトリに保存する場合は、はるかに優れています。
Steve Bennett

2
@arilwanを使用しpg_dump -h remote | pg_restore -h localhostます。
Ian Gow

4
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
JuhaPalomäki19年

122

テーブル名だけでなく、選択した列データのみを取得するクエリを作成することもできます。

COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

管理者権限あり

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

コマンドのpsqlバージョンに終了セミコロンが必要だとは思いません(\COPY ...)。そして、少なくとも私のバージョンのpsql(9.5.2)では、「DELIMITER」を指定する必要はありませんでした。デフォルトはコンマでした。
user1071847

選択したフィールドのCSVからテーブルにコピーする場合の構文の変化
user269867

99

Postgresからファイルを書き出す権限がない場合、コマンドラインからクエリを実行できることがわかります。

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv

7
「あらゆる環境」に最適です。最適1. Postgresqlまたはクライアントで特別な権限は必要ありません。2.相対パスを使用できます。そして3は、実際のCSV形式(セキュア引用)のために安全です。
Peter Krauss

34

これは機能します

psql dbname -F , --no-align -c "SELECT * FROM TABLE"

10
いいね。これは、コンマを含むフィールド内でコンマをエスケープしないように見えることに注意してください。
RecursivelyIronic

私はこれが好きで、なしで-F ,|セパレータとして使用します。ありがとう!
dsummersl 2016年

2
これは、一般的にエクスポート機能と見なされるものではなく、制御されたデータ表示です。違いはわずかですが重要です。これはCOPY、再利用するファイルを作成するステートメントよりも人間が読むことを目的としています
Romain G

7
危険 CSV形式ではなく、 "、"を含む配列またはテキストでは機能しません。適切なCSV引用を行いません。@ブライアンの答えを使用してください。
Peter Krauss

8

私が使用するバージョン9.5の場合、次のようになります。

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

7

このソリューションは、を使用して私に役立ちました\copy

psql -h <host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"

4

最も簡単な方法(を使用psql)は、--csvフラグを使用することです:

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'

これはPostgreSQLバージョン12以降でのみ機能します
Dirk

3

Hergs PGデータベースへのpgsl接続を使用して、Power Shellを動作させる方法を次に示します。

最初に、クライアントのエンコーディングを次のようにutf8に変更する必要がありました。 \encoding UTF8

次に、データを次のCSVファイルにダンプしました。

\copy (SELECT * FROM my_table) TO  C://wamp64/www/spider/chebi2/dump.csv CSV DELIMITER '~'

CSVファイルが好きではないため、区切り文字として〜を使用しました。通常はTSVファイルを使用しますが、区切り文字として「\ t」を追加できないため、めったに使用されない文字である〜を使用しました。


0

(anysqlクエリdatawanttoexport)を 'fileablsoutepathwihname'区切り文字 '、' csvヘッダーにコピーします。

これを使用すると、データをエクスポートすることもできます。


0

ここに記載されている他の回答はどれも実際には役に立たなかったため、私はこの回答を投稿しています。使えなかったCOPY正しい権限を持っていなかったため、Postgresから。そこで、「グリッド行のエクスポート」を選択し、出力をUTF-8として保存しました。

psql@Brianによって与えられたバージョンも別の理由のために、私のために動作しませんでした。それが機能しなかった理由は、明らかにWindowsコマンドプロンプト(私はWindowsを使用していた)がエンコード自体をいじっていたためです。私はこのエラーを受け続けました:

エラー:エンコーディング「WIN1252」のバイトシーケンス0x81の文字には、エンコーディング「UTF8」に同等のものはありません

私が最終的に使用したソリューションは、CSVファイルを読み取り、挿入ステートメントをPostgresテーブルに直接発行する短いJDBCスクリプト(Java)を記述することでした。これは機能しましたが、エンコードを変更していなければ、コマンドプロンプトも機能しました。


0

これを試してください:「COPY products_273 FROM '\ tmp \ products_199.csv' DELIMITER '、' CSV HEADER」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.