CodeGym /Corsi /SQL SELF /Importazione dei dati dai file CSV usando il comando `COP...

Importazione dei dati dai file CSV usando il comando `COPY`

SQL SELF
Livello 23 , Lezione 1
Disponibile

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 in psql. 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 students e 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 HEADER dice 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:

  1. Nessun carattere nascosto o spazio nella riga di intestazione.
  2. Usa la codifica giusta: in PostgreSQL di solito si consiglia UTF-8.
  3. 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.

2
Compito
SQL SELF, livello 23, lezione 1
Bloccato
Importazione dei dati nella tabella usando `COPY`
Importazione dei dati nella tabella usando `COPY`
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION