Esporta la tabella Postgres remota in un file CSV sul computer locale


15

Ho accesso in sola lettura a un database su un server remoto. Quindi, posso eseguire:

COPY products TO '/tmp/products.csv' DELIMITER ',';

Ma su quel server non ho i permessi per creare / salvare un file, quindi devo farlo sul mio computer locale.

Quando mi collego al database remoto, come posso eseguire un comando per salvare il file sul mio computer locale anziché sul server remoto?

Oppure, come posso eseguire un comando Linux per connettermi al database remoto, eseguire una query e salvare l'output come file sul mio computer locale?

Risposte:


29

Entrambi gli approcci già suggeriti sembrano essere inutilmente complicati.

Basta usare psqlil \copycomando integrato , che funziona esattamente come sul lato server COPYma esegue una copia tramite il protocollo wire al client e utilizza i percorsi client.

Poiché è un psqlcomando barra rovesciata, si omette il punto e virgola finale, ad esempio:

\copy products TO '/tmp/products.csv' CSV DELIMITER ','

Vedere la \copyvoce nel manuale per il psqlcomando e la documentazione del COPYcomando per maggiori dettagli.

Proprio come COPYè possibile utilizzare \copycon una (SELECT ...)query anziché con il nome di una tabella quando si copiano i dati (ma non in).


Un'alternativa generalmente inferiore che può essere utile in alcune situazioni limitate è quella di utilizzare:

psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'

e usa il -oflag o il reindirizzamento dell'output della shell per scrivere l'output in un file. Si dovrebbe quasi sempre usare \copyin preferenza a questo.


Ma ciò non consente le transazioni :(
Reza S

Uhm, certo che lo fa. Utilizzare un documento qui per alimentare psqluno script, iniziando BEGIN, quindi eseguendo i \copycomandi, quindi a COMMIT. Oppure usa psql -fper eseguire uno script piuttosto che usare un documento qui.
Craig Ringer,

Grazie per essere tornato ... ecco cosa ho finito e ha funzionato =)
Reza S

Puoi usare al -Aposto di -P format=unalignede anche io penso che tu abbia bisogno di un-P fieldsep=,
Evan Carroll

2

Il comando Linux è:

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'

1
Ciò non produrrà CSV, produrrà output di testo formattato. Se aggiungessi -t -P format=unaligned a quel comando, avresti avvicinato qualcosa di più, come un CSV delimitato da pipe difettoso, ma le pipe nel testo non sarebbero sfuggite, quindi non sarebbero valide.
Craig Ringer

Oh, avresti anche voluto -P fieldsep=','che questo sarebbe ancora più probabile che causasse errori a causa della mancanza di fuga. -P fieldsep_zero=onsarebbe OK se non ti dispiacesse analizzare il testo delimitato da byte nulli, poiché i byte null non possono verificarsi psqlnaturalmente nell'output.
Craig Ringer
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.