Wie exportiere ich eine Tabelle als CSV mit Überschriften auf Postgresql?

418

Ich versuche, eine PostgreSQL-Tabelle mit Überschriften über die Befehlszeile in eine CSV-Datei zu exportieren, erhalte sie jedoch zum Exportieren in eine CSV-Datei, jedoch ohne Überschriften.

Mein Code sieht wie folgt aus:

COPY products_273 to '/tmp/products_199.csv' delimiters',';
Elitmiar
quelle
Verwenden Sie ein Postgres> = 8.1?
Dana the Sane
1
Ich denke, ich werde einen Plan für ein Upgrade auf die neuere Version machen, der das Leben so viel einfacher macht
Elitmiar
1
Siehe auch stackoverflow.com/q/1517635/287948
Peter Krauss

Antworten:

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

wie im Handbuch beschrieben .

Milen A. Radev
quelle
7
Beachten Sie, dass das HEADER-Argument erst in 8.1 eingeführt wurde.
Dana the Sane
7
Welches ist, sagen wir, ein bisschen rostig.
Milen A. Radev
65
Hinweis COPYerfordert Administratorrechte. Verwenden Sie \COPYstattdessen, wenn Sie auf Probleme stoßen.
fny
5
Dies kann zu einer nicht konformen Ausgabe führen. Verwenden Sie besser "FORMAT csv" als "DELIMITER ','".
Ich bin
37
Für v9.5 ist der Befehl jetztCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal
223

Über die psql-Befehlszeile:

\COPY my_table TO 'filename' CSV HEADER

kein Semikolon am Ende.

Laurent Debricon
quelle
22
Diese Version ist bei weitem die beste, da der COPYBefehl Administratorzugriff erfordert
Matthew O'Riordan
2
Auch mit dem psqlAnsatz kann man die Ausgabe überall dort speichern, wo man Zugriff hat. Ich habe gerade den psqlAnsatz verwendet, um Daten von einem Remote-Server in eine lokale Datei zu bekommen. Sehr glatt.
Ian Gow
Viel besser, insbesondere beim Speichern in einem Verzeichnis, auf das Sie Zugriff haben, der Benutzer von postgres jedoch nicht.
Steve Bennett
2
@arilwan Verwendung pg_dump -h remote | pg_restore -h localhost.
Ian Gow
4
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
Juha Palomäki
122

Anstelle nur des Tabellennamens können Sie auch eine Abfrage schreiben, um nur ausgewählte Spaltendaten abzurufen.

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

mit Administratorrechten

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;
Dhruvil Thaker
quelle
Ich glaube nicht, dass Sie das abschließende Semikolon in der psql-Version des Befehls ( \COPY ...) benötigen . Und zumindest in meiner Version von psql (9.5.2) musste ich 'DELIMITER' nicht angeben; Die Standardeinstellung war ein Komma.
user1071847
wie sich die Syntax ändert, wenn ich für ausgewählte Felder von CSV in eine Tabelle
kopiere
99

Wenn ich keine Berechtigung zum Schreiben einer Datei aus Postgres habe, kann ich die Abfrage über die Befehlszeile ausführen.

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv
Brian
quelle
7
Das Beste für "jede Umgebung". Am besten für 1. Keine besonderen Berechtigungen bei Postgresql oder beim Kunden erforderlich; 2. kann relativen Pfad verwenden; und 3. ist sicher für echtes CSV-Format (sichere Zitate).
Peter Krauss
34

Das funktioniert

psql dbname -F , --no-align -c "SELECT * FROM TABLE"
jordg
quelle
10
Nett. Beachten Sie, dass dies Kommas in Feldern, die sie enthalten, nicht entgeht.
RekursivIronic
Ich mag das ohne das -F ,und benutze es |als Trennzeichen. Vielen Dank!
dsummersl
2
Dies wird nicht allgemein als Exportfunktion angesehen, sondern nur als kontrollierte Datenanzeige. Der Unterschied ist gering, aber wichtig: Dies ist eher dazu gedacht, von einem Menschen gelesen zu werden als die COPYAussage, die eine Datei erstellt, die wiederverwendet werden soll
Romain G
7
GEFAHR ist es nicht für das CSV-Format, funktioniert nicht für Arrays oder Text mit "," .. macht kein richtiges CSV-Zitat. Verwenden Sie die Antwort von @ Brian.
Peter Krauss
8

Für Version 9.5, die ich benutze, wäre es so:

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Maytham-ɯɐɥʇʎɐɯ
quelle
7

Diese Lösung hat bei mir funktioniert \copy.

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

Der einfachste Weg (mit psql) scheint die Verwendung von --csvflag zu sein:

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'
Yan Foto
quelle
Das funktioniert nur in PostgreSQL Version 12+
Dirk
3

Hier ist, wie ich es dazu gebracht habe, Power Shell mit pgsl connnect zu einer Heroku PG-Datenbank zu betreiben:

Ich musste zuerst die Client-Codierung wie folgt in utf8 ändern: \encoding UTF8

Dann haben die Daten in einer CSV-Datei wie folgt gespeichert:

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

Ich habe ~ als Trennzeichen verwendet, weil ich CSV-Dateien nicht mag. Normalerweise verwende ich TSV-Dateien, aber ich kann nicht '\ t' als Trennzeichen hinzufügen, also habe ich ~ verwendet, weil es ein selten verwendetes Zeichen ist.

Pferd O'Houlihan
quelle
0

Kopieren (anysql-Abfragedaten zum Exportieren) in 'fileablsoutepathwihname' delimiter ',' csv header;

Mit diesem können Sie auch Daten exportieren.

user3767321
quelle
0

Ich poste diese Antwort, weil keine der anderen hier gegebenen Antworten tatsächlich für mich funktioniert hat. Ich konnte nicht COPYinnerhalb von Postgres verwenden, da ich nicht die richtigen Berechtigungen hatte. Also habe ich "Rasterzeilen exportieren" gewählt und die Ausgabe als UTF-8 gespeichert.

Die psqlvon @Brian gegebene Version hat aus einem anderen Grund auch bei mir nicht funktioniert. Der Grund, warum es nicht funktioniert hat, ist, dass sich anscheinend die Windows-Eingabeaufforderung (ich habe Windows verwendet) selbst in die Codierung eingemischt hat. Ich bekam immer wieder diesen Fehler:

FEHLER: Zeichen mit der Byte-Sequenz 0x81 in der Codierung von "WIN1252" hat keine Entsprechung in der Codierung von "UTF8"

Die Lösung, die ich letztendlich verwendete, bestand darin, ein kurzes JDBC-Skript (Java) zu schreiben, das die CSV-Datei las und Einfügeanweisungen direkt in meine Postgres-Tabelle ausgab. Dies funktionierte, aber die Eingabeaufforderung hätte auch funktioniert, wenn die Codierung nicht geändert worden wäre.

Tim Biegeleisen
quelle
0

Versuchen Sie Folgendes: "COPY products_273 FROM '\ tmp \ products_199.csv' DELIMITER ',' CSV HEADER"

Mohit Singh
quelle