Pagine

2019-07-30

Esportazione da Postgres in CSV

Talvolta può essere utile ottenere un file da una tabella di database, per esempio quando qualcuno chiede "...mi puoi mandare l'elenco degli oggetti in database in un formato leggibile da un essere umano, così controllo che sia tutto corretto?".
La prima cosa che viene in mente per esportare una tabella di un database è il formato CSV, leggibile da tutti i fogli elettronici dell'universo; ma come costringere il nostro database a copiare i suoi dati in quel formato?

Bene, se stiamo usando Postgres, non c'è nulla di più semplice: accediamo alla console di Postgres e potremo scrivere:

COPY nomeTabella(campo1,campo2) 
TO 'percorso_dove_scrivere.csv' 
DELIMITER ',' 
CSV HEADER

dove la parola chiave DELIMITER indica cosa usare come divisore tra le colonne e CSV HEADER indica che vogliamo i nomi dei campi all'inizio. Questo comando permette di esportare tutta una tabella, scegliendo eventualmente solo alcuni campi.
Alla fine basta andare al percorso che è stato inserito per trovare il file, pronto per essere importato in Excel o Numbers o LibreOffice.

Però talvolta non abbiamo accesso a tutta la macchina su cui gira Postgres, oppure quando siamo costretti ad usare ssh per accedervi; può allora essere utile utilizzare una funzione del comando psql.
Una volta entrati in ssh sulla macchina, diamo questo comando:

psql -d nomeDb -U utente -A -F"," -c "query_per_esportazione" > output.csv

Il comando -U serve se abbiamo accesso al db solo tramite un certo utente e non il root; il comando -F permette di scegliere il divisore tra i campi e dopo il comando -c possiamo inserire tra virgolette la query il cui risultato deve essere esportato. Ovviamente, il file di uscita può essere rappresentato non solo dal nome (output.csv) ma anche dal percorso, se necessario. Sarà il posto dove andremo a cercare il risultato.

NOTA: di solito il formato CSV usa la virgola per separare i campi (Comma Separated Values), ma i fogli elettronici hanno voluto scompaginare le convezioni: per esempio, se usiamo Excel in italiano, le virgole indicano la posizione del punto decimale e non vengono quindi riconosciute come divisori. Al loro posto, Excel usa "punto e virgola", per cui nel comando precedente dovremo usare -F";", altrimenti il foglio elettronico metterà tutto in una colonna unica.

Ricordiamo che se siamo in ssh, il file sarà poi portato sul nostro computer locale tramite il comando scp.