Exportieren Sie die entfernte Postgres-Tabelle in eine CSV-Datei auf dem lokalen Computer

15

Ich habe schreibgeschützten Zugriff auf eine Datenbank auf einem Remoteserver. So kann ich ausführen:

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

Aber auf diesem Server habe ich keine Berechtigung zum Erstellen / Speichern einer Datei. Daher muss ich dies auf meinem lokalen Computer tun.

Wie kann ich beim Herstellen einer Verbindung zur entfernten Datenbank einen Befehl ausführen, um die Datei auf meinem lokalen Computer anstelle des entfernten Servers zu speichern?

Oder wie kann ich einen Linux-Befehl ausführen, um eine Verbindung zur entfernten Datenbank herzustellen, eine Abfrage auszuführen und die Ausgabe als Datei auf meinem lokalen Computer zu speichern?

tasmaniski
quelle

Antworten:

29

Beide bereits vorgeschlagenen Ansätze erscheinen unnötig kompliziert.

Verwenden Sie einfach psqlden integrierten \copyBefehl von, der genau wie der serverseitige Befehl funktioniert COPY, jedoch eine Kopie über das Wire-Protokoll an den Client sendet und Clientpfade verwendet.

Da es sich um einen psqlumgekehrten Schrägstrich handelt, lassen Sie das nachstehende Semikolon aus, z. B .:

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

Weitere Informationen finden Sie im \copyEintrag im Handbuch zum psqlBefehl und in der COPYBefehlsdokumentation .

Genau wie COPYSie verwenden können , \copymit einer (SELECT ...)Abfrage anstelle einen Tabellennamen beim Kopieren der Daten aus (aber nicht in).


Eine allgemein minderwertige Alternative, die in einigen wenigen Situationen nützlich sein kann, ist die Verwendung von:

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

Verwenden Sie die -oFlag- oder Shell-Ausgabeumleitung, um die Ausgabe in eine Datei zu schreiben. Sie sollten dies fast immer \copyvorziehen.

Craig Ringer
quelle
Aber das erlaubt keine Transaktionen :(
Reza S
Sicher ist es das. Verwenden Sie ein Here-Dokument, um psqlein Skript einzugeben. Beginnen Sie mit BEGIN, und führen Sie dann Ihre \copyBefehle aus COMMIT. Oder verwenden Sie psql -f, um ein Skript auszuführen, anstatt ein Here-Dokument zu verwenden.
Craig Ringer
Danke, dass du zurückgekommen bist ... das habe ich letztendlich getan und es hat funktioniert =)
Reza S
Sie können -Aanstelle von -P format=unalignedund auch ich denke, Sie brauchen eine-P fieldsep=,
Evan Carroll
2

Der Linux-Befehl lautet:

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'
tasmaniski
quelle
1
Dadurch wird keine CSV-Datei erstellt, sondern eine formatierte Textausgabe. Wenn Sie -t -P format=unaligned diesen Befehl ergänzen , erhalten Sie etwas Näheres, z. B. eine fehlerhafte CSV-Datei mit Pipe-Begrenzung, aber Pipe-Zeichen im Text werden nicht maskiert, sodass sie ungültig sind.
Craig Ringer
Oh, Sie möchten auch, -P fieldsep=','dass dies noch wahrscheinlicher zu Fehlern führt, wenn Sie nicht entkommen. -P fieldsep_zero=onwäre in Ordnung, wenn Sie nichts dagegen hätten, durch Null-Bytes getrennten Text zu analysieren, da Null-Bytes in der psqlAusgabe natürlich nicht vorkommen können .
Craig Ringer