psql - speichert die Befehlsergebnisse in einer Datei

283

Ich verwende psql, \dtum alle Tabellen in einer Datenbank aufzulisten, und ich muss die Ergebnisse speichern.

Wie lautet die Syntax zum Exportieren der Ergebnisse eines psql-Befehls in eine Datei?

pstanton
quelle
1
Siehe auch stackoverflow.com/questions/3939329/… .
Matt Solnit

Antworten:

478

Aus psqls Hilfe ( \?):

\ o [DATEI] sendet alle Abfrageergebnisse an Datei oder | Pipe

Die Befehlsfolge sieht folgendermaßen aus:

[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal

db=>\o out.txt
db=>\dt
db=>\q
jhwist
quelle
1
rufe ich das vor dem \ dt oder in Kombination auf? Bitte geben Sie die Syntax an. Danke.
Pstanton
118
Durch erneutes Tippen \owird es ausgeschaltet.
Carl G
3
Leider geht die Ausgabe von \?nicht in die Datei. :(
blitzen9872
für Ihre Art perusual Erlaubnis verweigert sagt, versuchen Sie, psql als Administrator auszuführen
Ajay Takur
1
Ja, \o queries-output.txtleitet alle nachfolgenden Befehle o / p in die benannte Datei um, queries-output.txtund durch Eingabe \o(erneut an der psql- Eingabeaufforderung) wird dieses Umleitungsverhalten zurückgesetzt.
Hygull
95

Der \oBefehl psql wurde bereits von jhwist beschrieben.

Ein alternativer Ansatz besteht darin, mit dem COPY TOBefehl direkt in eine Datei auf dem Server zu schreiben. Dies hat den Vorteil, dass es in einem einfach zu analysierenden Format Ihrer Wahl ausgegeben wird - anstelle des tabellarischen Formats von psql. Es ist auch sehr einfach, mit in eine andere Tabelle / Datenbank zu importieren COPY FROM.

NB! Dies erfordert Superuser-Berechtigungen und schreibt in eine Datei auf dem Server .

Beispiel: COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')

Erstellt eine CSV-Datei mit ';' als Feldtrennzeichen.

Einzelheiten finden Sie wie immer in der Dokumentation

intgr
quelle
Ich stimme @helvete zu, der hier vorgestellte Ansatz bietet dem Benutzer mehr Möglichkeiten, die Ausgabe auf individuellere Weise zu konfigurieren
Nathan Benton,
27

\copyDies ist ein Postgres-Befehl, der für jeden Benutzer verwendet werden kann. Ich weiß nicht, ob es für \ dt funktioniert oder nicht, aber die allgemeine Syntax wird über den folgenden Link reproduziert: Postgres SQL-Kopiersyntax

\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','

Oben wird die Ausgabe der Auswahlabfrage in dem als CSV-Datei bereitgestellten Dateinamen gespeichert

BEARBEITEN:

Für meinen psql-Server funktioniert der folgende Befehl. Dies ist eine ältere Version v8.5

copy (select * from table1) to 'full_path_filename' csv header;
Aakash Gupta
quelle
Sehr praktisch, danke. Das 'Kopieren' in '... Kopieren nach ...' ist jedoch nicht erforderlich. In den letzten Versionen schlägt der Befehl sogar fehl.
Tom
Tom, ich denke es war ein Tippfehler. Bearbeitet den Beitrag mit dem, der auf meiner Installation pgsql 8.5ver
Aakash Gupta
Nur eine kurze Anmerkung für alle, die versuchen, nach \ copy eine mehrzeilige Anweisung einzufügen und verwirrende Syntaxfehler zu erhalten, wie ich es gerade getan habe. Sie müssen in derselben Zeile wie \ copy fortfahren.
whoasked
Gibt es eine Möglichkeit, die \ Kopie auszuschalten? Ich habe festgestellt, dass, wenn ich eine Anweisung wie in Ihrem Beispiel ausführe und dann beispielsweise * aus Benutzern auswähle; dass die Ergebnisse an die zuletzt angegebene Datei angehängt werden, anstatt auf dem Bildschirm ausgegeben zu werden. Danke dir.
raphael75
6

Verwenden Sie den Parameter o des Befehls pgsql.

-o, --output = FILENAME Abfrageergebnisse an Datei (oder | Pipe) senden

psql -d DatabaseName -U UserName -c "SELECT * FROM TABLE" -o /root/Desktop/file.txt
Yavuz
quelle
3

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; Mit diesem Befehl wird die gesamte Tabelle als CSV gespeichert

Stephen
quelle
In postgres wird COPY besser durch \ COPY ersetzt, um die Notwendigkeit von db admin zu vermeiden. In Windows wird die Datei in C: \ tmp
Januar
3

Wenn Sie den folgenden Fehler erhalten haben ufgtoolspg=> COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';') ; ERROR: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

Sie können es folgendermaßen ausführen:

psql somepsqllink_or_credentials -c "COPY (SELECT foo, bar FROM baz) TO STDOUT (format csv, delimiter ';')" > baz.csv

Daniil Mashkin
quelle
2

Verwenden Sie die folgende Abfrage, um das Ergebnis in einer CSV-Datei zu speichern

\ copy (Ihre Abfrage) in den CSV-Header 'file path';

Beispiel

\ copy (Name, Datumsbestellung aus Kaufbestellung auswählen) in den Lebenslauf-Header '/home/ankit/Desktop/result.csv';

Hoffe das hilft dir.

Er.Ankit H Gandhi
quelle
1

Ich gehe davon aus, dass es dafür einen internen psql-Befehl gibt, aber Sie können den scriptBefehl auch über das Paket util-linux-ng ausführen :

BESCHREIBUNG Das Skript erstellt ein Typoskript für alles, was auf Ihrem Terminal gedruckt ist.

hlovdal
quelle
0

Dieser Ansatz funktioniert mit jedem psql-Befehl vom einfachsten bis zum komplexesten, ohne dass Änderungen oder Anpassungen am ursprünglichen Befehl erforderlich sind.

HINWEIS: Für Linux-Server.


  • Speichern Sie den Inhalt Ihres Befehls in einer Datei

MODELL

read -r -d '' FILE_CONTENT << 'HEREDOC'
[COMMAND_CONTENT]

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd

BEISPIEL

read -r -d '' FILE_CONTENT << 'HEREDOC'
DO $f$
declare
    curid INT := 0;
    vdata BYTEA;
    badid VARCHAR;
    loc VARCHAR;
begin
FOR badid IN SELECT some_field FROM public.some_base LOOP
    begin
    select 'ctid - '||ctid||'pagenumber - '||(ctid::text::point) [0]::bigint
        into loc
        from public.some_base where some_field = badid;
        SELECT file||' '
        INTO vdata
        FROM public.some_base where some_field = badid;
    exception
        when others then
        raise notice 'Block/PageNumber - % ',loc;
            raise notice 'Corrupted id - % ', badid;
            --return;
    end;
end loop;
end;
$f$;

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd
  • Führen Sie den Befehl aus

MODELL

sudo -u postgres psql [some_db] -c "$(cat sqlcmd)" >>sqlop 2>&1

BEISPIEL

sudo -u postgres psql some_db -c "$(cat sqlcmd)" >>sqlop 2>&1

  • Anzeigen / Verfolgen Ihrer Befehlsausgabe

cat sqlop

Getan! Vielen Dank! = D.

Eduardo Lucio
quelle
0

Ansatz für Docker

über den Befehl psql

 docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt

oder Abfrage aus SQL-Datei

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
Roman Rhrn Nesterov
quelle