wake-up-neo.net

So exportieren Sie eine PostgreSQL-Abfrage in eine CSV-Datei

Ich habe Probleme beim Exportieren meiner PostgreSQL-Ausgabe aus einer Shell in eine CSV-Datei.
Mein SQL-Skript heißt script.sql.

Ich habe den folgenden Befehl in meine Shell eingegeben: 

psql congress -af script.sql &> filename.csv

Wenn ich jedoch die filename.csv-Datei öffnete, werden die Werte aller Spalten in einer Spalte in der Excel-CSV gequetscht (siehe beiliegender Screenshot).

Dann habe ich einen anderen Weg versucht. Ich habe meinen script.sql folgendermaßen bearbeitet:

Copy (Select * From ...) To '/tmp/filename.csv' With CSV;

Dann habe ich den folgenden Befehl in die Shell in der Datenbank dbname eingegeben.

\i script.sql

Die Ausgabe ist:

COPY 162

Nun, meine Ausgabeabfrage hat 162 Zeilen. 

Also wurden die 162 Zeilen meiner Ausgabetabelle in die Shell kopiert. Wie kann ich sie in eine CSV-Datei einfügen oder verschieben? 

Oder, wenn ich die dateiname.csv verwende (Screenshot ist beigefügt), wie kann ich das Format dieser csv/Excel-Datei korrigieren? 

Screenshot of filename.csv

13
mflowww

Moderne Syntax:

COPY (SELECT * FROM ...) TO '/tmp/filename.csv' (format CSV);

Also wurden die 162 Zeilen meiner Ausgabetabelle in die Shell kopiert. Wie Kann ich sie in eine CSV-Datei einfügen oder verschieben?

Das Ergebnis ist der CSV-Datei. Öffnen Sie es mit einem beliebigen Tabellenkalkulationsprogramm, das passende Trennzeichen verwendet. Pro Dokumentation:

Die Standardeinstellung ist ein Tabulatorzeichen im Textformat, ein Komma im CSV-Format

Wie Patrick kommentiert können Sie den entsprechenden psql-Metabefehl \copy auf ähnliche Weise verwenden. Es schreibt (und liest) Dateien lokal in den Client und erfordert keine Superuser-Berechtigungen.

Weitere Erklärungen in diesen verwandten Antworten:

30

kopieren Sie zuerst Ihre Verbindungsinformationen in ~/.pgpass und 

cat ip:port:dbname:user:pass > ~/.pgpass
chmod 0600 ~/.pgpass
psql -h serverip -U userid dbname -af test.sql | gzip > result.txt.gz
0
Ash

Etwas tangierend geht es auch anders. 

Ich verwende Folgendes in einem Windows-Batch-Skript: -

psql.exe -U %cUser% -h %cHost% -p %cPort% -d %cDB% -t -o "%dumpDir%\tables.txt" -A -c "SELECT table_schema, table_name   FROM information_schema.tables WHERE table_schema = '%qSchema%';"

Der Trick besteht darin, sich an die Option -A zu erinnern. Es unterdrückt das Leerzeichen der Daten.

Ich tue dies, um Berechtigungsfehler durch den oben gezeigten COPY-Befehl zu vermeiden, wobei das Konto, das Postgress ausführt, nicht die gleichen Berechtigungen hat wie das Konto, das meine geplante Batchdatei ausführt.

Dadurch erhalten Sie eine Liste von Tabellen in einem bestimmten Schema mit folgenden Ergebnissen: -

myschema | mytable1

myschema | mytable2

Ich verwende dann den Befehl FOR batch, um jede Zeile zu verarbeiten. Wenn Sie sich wirklich eine CSV-Datei wünschten, müssten Sie Folgendes tun: -

ECHO table_schema,table_name > %dumpDir%\tables.csv
FOR /F "delims=|" %%p in (%dumpDir%\tables.txt) DO echo %%p,%%q >> %dumpDir%\tables.csv

Wahrscheinlich nicht der effizienteste Mechanismus, funktioniert aber gut mit einer kleinen Anzahl von Ausgabezeilen.

0
Darren Gill