Sono abbastanza sicuro che ognuno di noi si è trovato in una situazione in cui è necessario generare un rapporto e/o estrarre alcuni dati da un database e presentarli in un foglio elettronico. In molti casi, i nostri clienti preferiscono Excel per gestire fogli/report diffusi, perché, duh, è Excel.

Quindi, come affrontate questo problema? Copiate e incollate i dati? O usi una GUI del DBMS per generare il rapporto in un foglio di calcolo? Oggi, vi mostrerò una piccola ma comoda caratteristica di PostgreSQL -COPY.

Ciao COPY#

Dalla documentazione di COPY: “COPY sposta i dati tra le tabelle PostgreSQL e i file del sistema di file standard. COPY TO copia il contenuto di una tabella in un file, mentreCOPY FROM copia i dati da un file a una tabella (aggiungendo i dati a ciò che è già presente nella tabella). COPY TO può anche copiare i risultati di una query SELECT.”

Quindi, cosa fa COPY:

  1. Può copiare il contenuto di un file (dati) in una tabella, o
  2. può copiare il contenuto di una tabella (o il risultato di una query SELECT) in un file.

Se viene specificato un elenco di colonne, COPY copierà solo i dati nelle colonne specificate nel o dal file. Se ci sono colonne nella tabella che non sono nella lista delle colonne, COPY FROM inserirà i valori di default per quelle colonne.

COPY con un nome di file istruisce il server PostgreSQL a leggere direttamente da o scrivere su un file. Il file deve essere accessibile al server e il nome deve essere specificato dal punto di vista del server. Quando viene specificato STDIN o STDOUT, i dati vengono trasmessi attraverso la connessione tra il client e il server.

Suona bene? Proviamo!

Disclaimer: COPY ha la capacità di leggere/scrivere dati da/a file CSV e binari. Anche se sono sicuro che ci sono molti casi d’uso per l’utilizzo di file binari, in questo blogpost mi concentrerò solo sul suo utilizzo per i file CSV perché, personalmente per me, sono i più convenienti per gestire le serie di dati.

COPY TO#

Quando volete creare un file CSV da una query SELECT, o scaricare tutti i contenuti di una tabella in un file CSV, potete usare il comando “COPY … TO …”.

Utilizzando una query SELECT#

Quando volete copiare un set di risultati in un file CSV, il formato del comando COPY è:

1
COPY (<select-query-here>) TO <file-path>;

O, un esempio più reale:

1
COPY (SELECT * FROM people WHERE age > 21) TO '~/Desktop/adults.csv';

Come potete vedere, usiamo il comando COPY che copia i risultati in un file CSV sul filesystem locale. È possibile portare la query molto più avanti. Ecco un esempio di vita reale di un progetto a cui sto lavorando:

1
COPY (SELECT price_rules.* FROM quotes LEFT JOIN price_rules ON quotes.id = price_rules.chargeable_id where quotes.id = 437) TO '~/Desktop/exports/price_rules.csv' CSV;

Come potete vedere, potete usare qualsiasi query SELECT che possa restituire un set di dati. 🙂

1
COPY (SELECT * FROM people WHERE age > 21) TO '~/Desktop/adults.csv' CSV HEADER;

Aggiungere la parola chiave HEADER alla fine includerà le intestazioni nel file CSV, che sono i nomi delle colonne della tabella.

Anche un’altra caratteristica chiave dei file CSV sono i delimitatori. A seconda del delimitatore di carattere che volete che il file CSV abbia, potete specificare il carattere nel comando:

1
COPY (SELECT * FROM people WHERE age > 21) TO '~/Desktop/adults.csv' CSV DELIMITER ',' HEADER;

Utilizzando il nome di una tabella#

Quando volete che un’intera tabella sia scaricata in un CSV, il comando è molto più semplice. Basta specificare il nome della tabella e il file di destinazione:

1
COPY people TO '~/Desktop/people.csv' CSV DELIMITER ',' HEADER;

È tutto.

COPY FROM#

Ora, quando volete iniettare i dati dal file CSV in una tabella, potete usare il comando “COPY &mldr; FROM &mldr;”. La sintassi è molto simile, con una sola chiave di differenza:

1
COPY <table-name> FROM <file-path> DELIMITER ',' CSV HEADER;

O, usando un esempio di vita reale:

1
COPY addresses FROM '~/Desktop/addresses.csv' DELIMITER ',' CSV HEADER;

Outro#

COPY è una caratteristica davvero pulita e interessante di Postgres. Per brevità, ho cercato di mantenere questo blogpost breve e semplice. Se avete pensieri e domande, sentitevi liberi di lasciarmi un commento. Oppure, se non vi sentite chiacchieroni, potete andare alla documentazione COPY.

Vi è piaciuto questo articolo? Iscriviti alla mia newsletter e ricevi i miei post freschi nella tua casella di posta. È breve e dolce, e viene inviata mensilmente a più di 1.000 abbonati.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.