Ciao ragazzi! Immaginate di avere una tabella Excel con 10.000 righe e il capo che ti dice: "Carica tutto questo nel database!" Eh... se provi a inserire i dati a mano, beh… ti serviranno non solo skill SQL, ma pure una vacanza. 😅
Per fortuna, PostgreSQL ha un comando che funziona come un teletrasporto dal CSV al database — è COPY. Carica i dati al volo, in massa e senza casino. Oggi vediamo come funziona COPY, come preparare i dati e cosa fare se nel file trovi una "virgola ballerina" o un carattere strano. Andiamo!
Basi del comando COPY
COPY è un comando di PostgreSQL che permette di spostare dati tra una tabella e il filesystem. È utile per caricare tanti dati nel database o per esportarli.
Esempio di sintassi COPY per caricare dati in una tabella:
COPY table_name FROM 'path/to/your/file.csv' DELIMITER ',' CSV HEADER;
Parametri principali:
FROM 'path/to/your/file.csv': indica il percorso del tuo file CSV.DELIMITER ',': specifica il carattere separatore (qui è la virgola).CSV HEADER: dice che il file CSV ha l’intestazione (la prima riga con i nomi delle colonne).
Il comando COPY lavora direttamente sul server, quindi è super veloce quando hai tanti dati da caricare.
Differenza tra COPY e \COPY
A volte puoi confonderti tra COPY e \COPY.
COPY: gira lato server. Si usa per caricare file che stanno sul server.\COPY: comando client, disponibile inpsql. Carica i dati dal tuo computer locale.
Se lavori sulla tua macchina, probabilmente userai \COPY. Ne parliamo tra poco.
Esempio di utilizzo di COPY
Passiamo subito a un esempio pratico per capire meglio come funziona.
Passo 1: Preparazione della tabella
Immagina che stiamo creando una tabella per salvare info sugli studenti:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
date_of_birth DATE,
grade FLOAT
);
Passo 2: Preparazione del file CSV
Il formato del tuo file CSV deve essere uguale alla tabella. Esempio di file students.csv:
first_name,last_name,date_of_birth,grade
John,Doe,2001-05-15,85.5
Jane,Smith,2000-12-22,90.0
Alice,Johnson,2002-03-10,78.0
Bob,Brown,2001-08-30,NULL
Occhio: l’ordine delle colonne nel CSV deve essere lo stesso della tabella, e i tipi di dati devono combaciare (ad esempio, la data deve essere nel formato YYYY-MM-DD).
Passo 3: Caricamento dei dati
Per caricare il file students.csv nella tabella students usa questo comando:
COPY students (first_name, last_name, date_of_birth, grade)
FROM '/path/to/your/students.csv'
DELIMITER ','
CSV HEADER;
Cosa succede qui?
- Indichiamo il nome della tabella
studentse le colonne dove caricare i dati. - Il percorso del file indica dove si trova.
- Il separatore
,dice che i dati sono separati da virgole. - Il parametro
CSV HEADERdice a PostgreSQL che la prima riga del file contiene i nomi delle colonne.
Risultato:
Dopo aver lanciato il comando, i dati dal file vengono caricati nella tabella e puoi subito controllarli:
SELECT * FROM students;
Limitazioni e particolarità
Per evitare errori, assicurati che il tuo file CSV rispetti questi requisiti:
- Nessun carattere nascosto o spazio nella riga di intestazione.
- Usa la codifica giusta: in PostgreSQL di solito si consiglia UTF-8.
- Il separatore deve essere lo stesso del parametro
DELIMITER.
Errori tipici durante il caricamento con COPY:
Struttura dei dati non corrispondente. Ad esempio, se provi a caricare un valore testuale in un campo numerico:
ERROR: invalid input syntax for type numeric: "abc"
Per evitare questi problemi, controlla che i dati siano del tipo giusto.
Errore nel percorso del file.
Se il file non è in una cartella accessibile da PostgreSQL sul server, riceverai un errore:
ERROR: could not open file "/path/to/your/file.csv" for reading: Permission denied
La soluzione può essere impostare correttamente i permessi sul file.
Come controllare che i dati siano stati caricati correttamente?
Dopo il caricamento, è utile verificare che tutto sia andato bene. Ad esempio:
Controllo del numero totale di righe:
SELECT COUNT(*) FROM students;
Cerca valori vuoti (ad esempio, se il campo grade contiene NULL):
SELECT * FROM students WHERE grade IS NULL;
Consigli utili per lavorare con COPY
Logga gli errori. Se vuoi salvare gli errori in un file separato, usa il parametro LOG ERRORS. (In PostgreSQL versione 12+).
Disattiva indici e trigger.
Quando carichi tanti dati puoi disattivare temporaneamente gli indici:
ALTER TABLE students DISABLE TRIGGER ALL;
Usa le transazioni.
Così puoi caricare i dati "in modo atomico" — o si caricano tutti, o si annulla tutto in caso di errore:
BEGIN;
COPY students FROM '/path/to/your/file.csv' CSV HEADER;
COMMIT;
Applicazioni pratiche
Saper usare il comando COPY non serve solo agli admin dei database — anche per gli sviluppatori può essere una vera salvezza. Immagina che ricevi un sacco di dati da un’API esterna: prima li salvi in un file CSV, poi li carichi al volo in PostgreSQL — e puoi già iniziare ad analizzarli. Oppure, i colleghi ti chiedono di migrare il loro vecchio database in un nuovo sistema su PostgreSQL. In questi casi COPY è davvero una bacchetta magica.
I file CSV si trovano ovunque nei progetti reali. Ad esempio:
- Carichi le statistiche di vendita in un sistema di analytics.
- Importi una lista di utenti da una CRM esterna.
- Sposti dati da Excel a PostgreSQL senza impazzire.
Per oggi chiudiamo la panoramica sul comando COPY. Nella prossima lezione vediamo come preparare le tabelle per il caricamento dei dati e pensare la loro struttura per far girare tutto veloce e affidabile. Intanto, non aver paura di sperimentare — COPY ti apre davvero tante possibilità comode per lavorare con grandi quantità di informazioni.
GO TO FULL VERSION