Risposte:
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
\o
nuovo lo disattiva.
\?
non va nel file. :(
\o queries-output.txt
reindirizza tutti i comandi successivi su file denominati queries-output.txt
e digitando \o
(di nuovo sul prompt psql ) ripristina questo comportamento di reindirizzamento.
Il \o
comando psql era già stato descritto da jhwist.
Un approccio alternativo sta usando il COPY TO
comando 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
\copy
che è 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;
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
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.
Presumo che esistano alcuni comandi psql interni per questo, ma potresti anche eseguire il script
comando dal pacchetto util-linux-ng :
DESCRIZIONE Script crea un dattiloscritto di tutto ciò che è stampato sul tuo terminale.
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.
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
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
cat sqlop
Fatto! Grazie! = D
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