So verbergen Sie die Dekoration der Ergebnismenge in der Psql-Ausgabe

78

Wie verbergen Sie die Spaltennamen und die Zeilenanzahl in der Ausgabe von psql?

Ich führe eine SQL-Abfrage über psql aus mit:

psql --user=myuser -d mydb --output=result.txt -c "SELECT * FROM mytable;"

und ich erwarte Ausgabe wie:

1,abc
2,def
3,xyz

aber stattdessen bekomme ich:

id,text
-------
1,abc
2,def
3,xyz
(3 rows)

Natürlich ist es nicht unmöglich, die oberen beiden Zeilen und die untere Zeile nachträglich herauszufiltern, aber gibt es eine Möglichkeit, dies nur mit psql zu tun? Beim Lesen der Manpage sehe ich Optionen zum Steuern des Feldtrennzeichens, aber nichts zum Ausblenden von Fremdausgaben.

Cerin
quelle

Antworten:

98

Sie können die Option -toder verwenden --tuples-only:

psql --user = myuser -d mydb --output = result.txt -t -c "SELECT * FROM mytable;"

Bearbeitet (mehr als ein Jahr später), um hinzuzufügen:

Möglicherweise möchten Sie auch den COPYBefehl auschecken . Ich habe keine PostgreSQL-Instanzen mehr zum Testen zur Hand, aber ich denke, Sie können etwas in diese Richtung schreiben:

psql --user = myuser -d mydb -c "COPY mytable TO 'result.txt' DELIMITER ','"

(außer dass result.txtdies ein absoluter Pfad sein muss). Der COPYBefehl unterstützt auch ein intelligenteres CSV-Format. siehe seine Dokumentation .

Ruakh
quelle
24
Wenn Sie alternativ die Kopfzeile, aber nicht die Fußzeile mit Zeilenanzahl möchten, führen Sie psql mit --pset = "footer = off"
Gabriel Burt am
3
COPYkann in der Tat eine gültige Alternative sein, aber die Datei wird auf dem Server und nicht auf dem Computer landen, auf dem psql ausgeführt wird ...
fvu
@fvu: Guter Punkt. Normalerweise lief ich psql auf dem Server, daher war das für mich kein Problem. . .
Ruakh
Wenn Sie möchten, dass die Datei auf dem Client-Dateisystem landet, verwenden Sie die Datei \ COPY von psql (dh fügen Sie einen Backslash vor dem Befehl COPY hinzu)
Alex Bitek
3
Ich denke, @GabrielBurt Kommentar verdient eine eigenständige Antwort. Genau das habe ich gesucht, um eine CSV mit Header zu generieren, aber ohne die lästige (nnnn rows)Fußzeile.
Pierre D
22

Sie können die Ausgabe auch aus psql umleiten und dieselbe Option verwenden. Verwenden Sie \ o, um die Ausgabedatei \psetfestzulegen , und \ t, um nur Tupel auszugeben (oder um nur die "Fußzeile" der Zeilenanzahl zu deaktivieren).

\o /home/flynn/queryout.txt
\t on
SELECT * FROM a_table;
\t off
\o

Alternative,

\o /home/flynn/queryout.txt
\pset footer off
. . .
epic_fil
quelle
3

in der Regel , wenn Sie den psql generierte Ausgabe analysieren wollen würden Sie die einstellen wollen -Aund -F...

    # generate t.col1, t.col2, t.col3 ...
    while read -r c; do test -z "$c" || echo  , $table_name.$c  | \
       perl -ne 's/\n//gm;print' ; \
       done < <(cat << EOF | PGPASSWORD=${postgres_db_useradmin_pw:-} \
       psql -A -F  -v -q -t -X -w -U \
       ${postgres_db_useradmin:-} --port $postgres_db_port --host $postgres_db_host -d \
       $postgres_db_name -v table_name=${table_name:-}
    SELECT column_name
    FROM information_schema.columns
    WHERE 1=1
    AND table_schema = 'public'
    AND table_name   =:'table_name'  ;
    EOF
    )
    echo -e "\n\n"

Ein Beispiel für den vollständigen Bash-Aufruf finden Sie hier :

Yordan Georgiev
quelle