psql - salva i risultati del comando in un file


Risposte:


479

Dall'aiuto di psql ( \?):

\ o [FILE] invia tutti i risultati della query a file o | pipe

La sequenza di comandi sarà simile a questa:

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

db=>\o out.txt
db=>\dt
db=>\q

1
lo chiamo prima di \ dt o in combinazione? per favore includi la sintassi grazie.
Pstanton,

118
Digitare di \onuovo lo disattiva.
Carl G,

3
Purtroppo, l'output di \?non va nel file. :(
blitzen9872,

per il vostro gentile permesso perusuale negato dice di provare a eseguire psql come amministratore
Ajay Takur

1
Sì, \o queries-output.txtreindirizza tutti i comandi successivi su file denominati queries-output.txte digitando \o(di nuovo sul prompt psql ) ripristina questo comportamento di reindirizzamento.
Hygull,

95

Il \ocomando psql era già stato descritto da jhwist.

Un approccio alternativo sta usando il COPY TOcomando per scrivere direttamente su un file sul server. Questo ha il vantaggio di essere scaricato in un formato facile da analizzare a tua scelta, piuttosto che nel formato tabulato di psql. È anche molto facile importare in un'altra tabella / database usando COPY FROM.

NB! Ciò richiede i privilegi di superutente e scriverà su un file sul server .

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

Crea un file CSV con ';' come separatore di campo.

Come sempre, consultare la documentazione per i dettagli


Sono d'accordo @helvete, l'approccio presentato qui fornisce più potenza all'utente per configurare l'output in un modo più personalizzabile
Nathan Benton

27

\copyche è un comando postgres può funzionare per qualsiasi utente. Non so se funziona per \ dt o no, ma la sintassi generale viene riprodotta dal seguente link Sintassi della copia di Postgres SQL

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

Quanto sopra salverà l'output della query di selezione nel nome file fornito come file CSV

MODIFICARE:

Per il mio server psql il seguente comando funziona, questa è una versione precedente v8.5

copy (select * from table1) to 'full_path_filename' csv header;

Molto utile, grazie. Ma la 'copia' in '... copia in ...' non è richiesta, infatti nelle versioni recenti causa il fallimento del comando.
Tom,

Tom, penso che sia stato un errore di battitura. Ho modificato il post con quello che funziona sulla mia installazione pgsql 8.5ver
Aakash Gupta,

Solo una breve nota a chiunque tenti di incollare in un'istruzione multilinea dopo \ copy e ottenga errori di sintassi confusi, come ho appena fatto. Devi continuare sulla stessa riga di \ copy.
Chiesto

C'è un modo per disattivare \ copy? Ho scoperto che se eseguo una dichiarazione come nel tuo esempio, e quindi corro, ad esempio, seleziono * dagli utenti; che aggiungerà i risultati al file più recente che ho specificato invece di emettere sullo schermo. Grazie.
raphael75

6

Utilizzare o il parametro del comando pgsql.

-o, --output = FILENAME invia i risultati della query al file (o | pipe)

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

3

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; questo comando viene utilizzato per memorizzare l'intera tabella come CSV


In postgres COPY è meglio sostituito da \ COPY per evitare la necessità di db admin. In Windows questo mette il file in C: \ tmp
Jan

3

Se hai il seguente errore 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.

puoi eseguirlo in questo modo:

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


2

Utilizzare la query seguente per archiviare il risultato nel file CSV

\ copy (la tua query) nell'intestazione csv 'percorso file';

Esempio

\ copy (seleziona nome, ordine_data da ordine_acquisto) nell'intestazione cvs '/home/ankit/Desktop/result.csv';

Spero che questo ti aiuti.


1

Presumo che esistano alcuni comandi psql interni per questo, ma potresti anche eseguire il scriptcomando dal pacchetto util-linux-ng :

DESCRIZIONE Script crea un dattiloscritto di tutto ciò che è stampato sul tuo terminale.


0

Questo approccio funzionerà con qualsiasi comando psql dal più semplice al più complesso senza richiedere modifiche o adattamenti al comando originale.

NOTA: per server Linux.


  • Salva il contenuto del tuo comando in un file

MODELLO

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

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd

ESEMPIO

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
  • Esegui il comando

MODELLO

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

ESEMPIO

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

  • Visualizza / traccia l'output del comando

cat sqlop

Fatto! Grazie! = D


0

Approccio per docker

tramite comando psql

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

o query dal file sql

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.