Vai al contenuto principale

Gestire database PostgreSQL in Python con psycopg2

Scopri come creare, connetterti e gestire database PostgreSQL usando il pacchetto psycopg2 di Python.
Aggiornato 29 set 2026  · 14 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

I dati sono il cuore di quasi ogni applicazione digitale che ti viene in mente. Dalle app mobile e i videogiochi agli strumenti bancari e ai veicoli autonomi, tutto si basa sui dati. Dove sono archiviati tutti questi dati? Nei database.

Un database è una raccolta organizzata di dati strutturati, in genere archiviata elettronicamente in un sistema informatico. Nonostante lo sviluppo recente di nuovi tipi di database (progettati per gestire l’aumento di volume e varietà dei dati), una quantità considerevole di dati nel mondo è ancora conservata nei cosiddetti database relazionali. I database relazionali archiviano i dati come raccolte di tabelle predefinite con righe e colonne collegate da una o più relazioni.

Saper manipolare ed estrarre dati da questi database è un’abilità fondamentale nell’industria dei dati ed è sempre più richiesta. Il modo standard per creare e gestire database è SQL (Structured Query Language). SQL è il mattone di base di alcuni tra i database relazionali più popolari sul mercato, come PostgreSQL, Microsoft SQL Server, MySQL e SQLite

In questo tutorial ci concentreremo sui database basati su PostgreSQL e su come crearli, connetterti e gestirli usando Python. Il tandem SQL-Python è una delle competenze imprescindibili da padroneggiare nel tuo percorso in data science. Per connettere Python a PostgreSQL useremo il pacchetto psycopg2, l’adapter PostgreSQL per Python più popolare. Pronto alla sfida? Iniziamo!

Capire PostgreSQL

PostgreSQL è un database relazionale open source leggero e gratuito. Grazie alla sua architettura collaudata, affidabilità, integrità dei dati e integrazione fluida con altri linguaggi di programmazione popolari, come Python e R, PostgreSQL è ampiamente accettato dall’industria, con aziende di ogni dimensione e area geografica che lo utilizzano.

PostgreSQL utilizza ed estende il linguaggio SQL combinandolo con molte funzionalità che consentono di archiviare e scalare in sicurezza i carichi di lavoro di dati più complessi.

Per iniziare a usare PostgreSQL, devi prima installarlo sul tuo computer. Sul sito ufficiale di PostgreSQL trovi numerosi pacchetti e installer pronti all’uso e un archivio del codice sorgente disponibile per diverse piattaforme e casi d’uso.

Per questo tutorial useremo Postgres App, una semplice app nativa per macOS che include tutte le funzionalità necessarie per iniziare con PostgreSQL, ma tieni presente che tutti gli altri pacchetti disponibili sono altrettanto validi, e la sintassi PostgreSQL per eseguire query è la stessa tra i vari pacchetti.

Se vuoi saperne di più su PostgreSQL, dai un’occhiata alla nostra Guida per principianti a PostgreSQL e all’ampia offerta di corsi SQL.

Capire psycopg2

Per connetterti a un database già creato sul tuo sistema o su Internet, dovrai istruire Python su come rilevarlo. In altre parole, dovrai dire a Python che il database di tuo interesse è un database PostgreSQL.

In Python hai diverse opzioni tra cui scegliere. In questo caso useremo psycopg2, probabilmente l’adapter PostgreSQL per Python più popolare. Psycopg2 richiede alcuni prerequisiti per funzionare correttamente sul tuo computer. Una volta installati (leggi la documentazione per maggiori informazioni), puoi installare psycopg2 come qualsiasi altro pacchetto Python:

pip install psycopg2

Tuttavia, se vuoi usare psycopg2 in modo diretto, puoi anche installare psycopg2-binary, una versione stand-alone del pacchetto che non richiede un compilatore o librerie esterne. Questa è l’installazione preferita per i nuovi utenti.

pip install psycopg2-binary

Infine, se usi Python in un ambiente Conda, dovresti installare psycopg2 tramite l’installazione Anaconda:

conda install -c anaconda psycopg2

Ora che è tutto pronto, creiamo la tua prima connessione alla sessione PostgreSQL con psycopg2!

Collegare Python a PostgreSQL

Per usare Python per interagire con un database PostgreSQL, dobbiamo creare una connessione. Questo si fa con la funzione connect() di psycopg2, che crea una nuova sessione del database e restituisce una nuova istanza di connessione.

Per questo tutorial, ci connetteremo a un database chiamato “datacamp_courses” ospitato in locale.

conn = psycopg2.connect(database = "datacamp_courses", 
                        user = "datacamp", 
                        host= 'localhost',
                        password = "postgresql_tutorial",
                        port = 5432)

I parametri di connessione di base richiesti sono:

  • database. Il nome del database.
  • user. Nome utente richiesto per l’autenticazione.
  • password. Password usata per l’autenticazione.
  • host. Indirizzo del server del database (nel nostro caso il database è in locale, ma potrebbe essere un indirizzo IP).
  • port. Numero di porta di connessione (per impostazione predefinita 5432 se non specificato).

Creare una tabella in PostgreSQL

È il momento di creare la tua prima tabella nel database datacamp_courses. Vogliamo creare una tabella con informazioni su alcuni corsi del catalogo di DataCamp. La tabella ha il seguente schema:

La specifica ci fornisce molte informazioni sulle colonne della tabella. La chiave primaria della tabella dovrebbe essere course_id e il suo tipo di dato dovrebbe essere un intero. Una chiave primaria è un vincolo che impone che i valori della colonna non siano nulli e siano univoci. Ti consente di identificare in modo univoco una o più istanze presenti nella tabella.

Le restanti colonne forniscono informazioni sul nome del corso, il nome del docente del corso e l’argomento del corso.

Prima di creare la tabella, è importante spiegare come funziona l’istanza di connessione che hai appena creato. In sostanza, la connessione incapsula una sessione del database e ti consente di eseguire comandi e query SQL, come SELECT, INSERT, CREATE, UPDATE o DELETE, usando il metodo cursor(), e di rendere persistenti le modifiche usando il metodo commit() .

Una volta creata l’istanza del cursore, puoi inviare comandi al database usando il metodo execute() e recuperare dati da una tabella usando fetchone(), fetchmany() o fetchall().

Infine, è importante chiudere il cursore e la connessione al database quando hai terminato le operazioni. In caso contrario, continueranno a occupare risorse lato server. Per farlo, puoi usare il metodo close() .

Qui sotto trovi il codice per creare la tabella datacamp_courses:

# Open a cursor to perform database operations
cur = conn.cursor()
# Execute a command: create datacamp_courses table
cur.execute("""CREATE TABLE datacamp_courses(
            course_id SERIAL PRIMARY KEY,
            course_name VARCHAR (50) UNIQUE NOT NULL,
            course_instructor VARCHAR (100) NOT NULL,
            topic VARCHAR (20) NOT NULL);
            """)
# Make the changes to the database persistent
conn.commit()
# Close cursor and communication with the database
cur.close()
conn.close()

Questo è un esempio molto basilare di come creare tabelle su PostgreSQL, ma le cose possono diventare molto più complesse. Se vuoi saperne di più su come creare un database PostgreSQL ed esplorarne la struttura, i tipi di dati e come normalizzare i database, dai un’occhiata al nostro corso Creating PostgreSQL Database.

Eseguire query PostgreSQL di base in Python

La tabella datacamp_courses è pronta; ora è il momento di usare SQL per eseguire alcune query di base!

INSERT 

Avrai notato che finora la tabella non ha valori. Per creare record nella tabella datacamp_courses, ci serve il comando INSERT.

cur = conn.cursor()

cur.execute("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES('Introduction to SQL','Izzy Weber','Julia')");

cur.execute("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES('Analyzing Survey Data in Python','EbunOluwa Andrew','Python')");

cur.execute("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES('Introduction to ChatGPT','James Chapman','Theory')");

cur.execute("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES('Introduction to Statistics in R','Maggie Matsui','R')");

cur.execute("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES('Hypothesis Testing in Python','James Chapman','Python')");

conn.commit()
cur.close()
conn.close()

La tabella risultante appare così:

course_id

course_name

course_instructor

topic

1

Introduction to SQL

Izzy Weber

Julia

2

Analyzing Survey Data in Python

EbunOluwa Andrew

Python

3

Introduction to ChatGPT

James Chapman

Theory

4

Introduction to Statistics in R

Maggie Matsui

R

5

Hypothesis Testing in Python

James Chapman

Python

SELECT 

Leggere i dati nei database SQL è probabilmente qualcosa che farai spesso nel tuo percorso di data science. In genere si parla di query SELECT. Per ora, vediamo come se la cava la tabella datacamp_courses.

Useremo l’intramontabile istruzione SELECT * FROM database_name per leggere tutti i dati disponibili nella tabella. Poi useremo il metodo fetchall() per recuperare tutte le righe disponibili. Nota che PostgreSQL crea automaticamente un indice numerico per la colonna course_id.

cur = conn.cursor()
cur.execute('SELECT * FROM datacamp_courses;')
rows = cur.fetchall()
conn.commit()
conn.close()
for row in rows:
    print(row)
(1, 'Introduction to SQL', 'Izzy Weber', 'Julia')
(2, 'Analyzing Survey Data in Python', 'EbunOluwa Andrew', 'Python')
(3, 'Introduction to ChatGPT', 'James Chapman', 'Theory')
(4, 'Introduction to Statistics in R', 'Maggie Matsui', 'R')
(5, 'Hypothesis Testing in Python', 'James Chapman', 'Python')

UPDATE 

I dati spesso contengono errori. Avrai notato nella sezione precedente che l’argomento associato al corso “Introduction to SQL” è Julia. Dopo aver verificato le informazioni sul corso, abbiamo scoperto l’errore. Dobbiamo cambiarlo in “SQL”. Possiamo farlo con l’istruzione UPDATE, come segue:

cur = conn.cursor()
cur.execute("UPDATE datacamp_courses SET topic = 'SQL' WHERE course_name = 'Introduction to SQL';")
conn.commit()
conn.close()

DELETE 

Infine, potresti voler eliminare uno dei record nella tua tabella. Per esempio, eliminiamo il corso Introduction to Statistics in R:

cur = conn.cursor()
cur.execute("""DELETE from datacamp_courses WHERE course_name = 'Introduction to Statistics in R'""");
conn.commit()
cur.close()

Query PostgreSQL avanzate in Python

Nella sezione precedente abbiamo visto le query SQL più basilari. Ma c’è molto altro da imparare. Vediamo alcune query più avanzate.

ORDER BY

Mettiamo che tu voglia ordinare il database per nome del docente. Puoi usare l’istruzione ORDER BY:

cur = conn.cursor()

cur.execute('SELECT * FROM datacamp_courses ORDER BY course_instructor')
rows = cur.fetchall()
for row in rows:
    print(row)
(2, 'Analyzing Survey Data in Python', 'EbunOluwa Andrew', 'Python')
(1, 'Introduction to SQL', 'Izzy Weber', 'SQL')
(3, 'Introduction to ChatGPT', 'James Chapman', 'Theory')
(4, 'Hypothesis Testing in Python', 'James Chapman', 'Python')

GROUP BY

Potresti voler eseguire alcune funzioni di aggregazione in diversi gruppi di dati. Ad esempio, potresti essere interessato a calcolare il numero di corsi per i vari docenti. Puoi eseguire questo tipo di operazione con la funzione GROUP BY.

cur = conn.cursor()
cur.execute('SELECT course_instructor, COUNT(*) FROM datacamp_courses GROUP BY course_instructor')
rows = cur.fetchall()
for row in rows:
    print(row)
('James Chapman', 2)
('Izzy Weber', 1)
('EbunOluwa Andrew', 1)

JOIN

Finora abbiamo lavorato solo con la tabella datacamp_course. Tuttavia, inizi a sfruttare il pieno potenziale dei database relazionali, come PostgreSQL, quando lavori con più tabelle contemporaneamente.

Lo strumento magico per combinare più tabelle è l’operazione JOIN. Immagina di avere una seconda tabella nel database chiamata programming_languages che contiene informazioni di base sui principali linguaggi di programmazione per la data science, inclusi il nome, la posizione nel TIOBE Index e il numero di corsi sul linguaggio su Datacamp. La tabella appare così:

language_id

language_name

course_number

tiobe_ranking

1

SQL

31

8

2

Python

157

1

3

R

132

16

4

Julia

2

33

5

Scala

1

38

Immagina di voler unire le due tabelle per ottenere le informazioni sui corsi insieme alla posizione del linguaggio nel TIOBE Index. Useremo un INNER JOIN per ottenere solo le informazioni dei linguaggi di programmazione che compaiono nella tabella datacamp_course.

cur = conn.cursor()
cur.execute("""SELECT course_name, course_instructor, topic, tiobe_ranking
FROM datacamp_courses
INNER JOIN programming_languages
ON datacamp_courses.topic = programming_languages.language_name""")
rows = cur.fetchall()
for row in rows:
    print(row)
('Introduction to SQL', 'Izzy Weber', 'SQL', 8)
('Analyzing Survey Data in Python', 'EbunOluwa Andrew', 'Python', 1)
('Hypothesis Testing in Python', 'James Chapman', 'Python', 1)

Questo è solo un esempio, ma il potenziale dei join in SQL è infinito, rendendoli un argomento imprescindibile. Il nostro corso, il tutorial e il cheatsheet sui join ti aiuteranno a iniziare.

Prime basi con SQLAlchemy

Psycopg2 è un ottimo strumento per connettersi ai database PostgreSQL. Ma se devi lavorare con database ospitati su diversi sistemi SQL, come Oracle e MySQL? In questi scenari, può essere meglio usare uno strumento che si connetta a diversi tipi di database SQL. A tal fine, SQLAlchemy è un’ottima candidata.

In parole semplici, SQLAlchemy consente agli utenti di connettere i database usando il linguaggio Python, eseguire query SQL tramite programmazione a oggetti e snellire il flusso di lavoro.

Anche se la sintassi differisce rispetto a psycopg2, puoi fare pressoché le stesse cose. Qui sotto trovi un esempio su come creare un engine per connetterti ai nostri dataset datacamp_courses e leggere tutti i dati disponibili nella tabella datacap_course

import sqlalchemy as db


engine = db.create_engine("postgresql://datacamp@localhost:5432/datacamp_courses")
conn = engine.connect() 
output = conn.execute("SELECT * FROM datacamp_courses")
print(output.fetchall())
conn.close()
[(3, 'Introduction to ChatGPT', 'James Chapman', 'Theory'),
 (5, 'Hypothesis Testing in Python', 'James Chapman', 'Python'),
 (2, 'Analyzing Survey Data in Python', 'EbunOluwa Andrew', 'Python'),
 (1, 'Introduction to SQL', 'Izzy Weber', 'SQL')]

SQLAlchemy è un altro ottimo strumento che vale la pena imparare. Per avere un assaggio di come funziona, dai un’occhiata al nostro Tutorial su SQLALchemy.

Usare PostgreSQL in DataCamp DataLab

In DataCamp, lavoriamo sodo per rendere la data science più semplice e accessibile a tutti. È da qui che è nato DataCamp DataLab, un notebook cloud progettato specificamente per la data science. Puoi pensare a DataCamp DataLab come a un mix tra Jupyter Notebook e Google Docs, che permette agli utenti di scrivere codice, analizzare dati individualmente o in gruppo e condividere insight.

Collegare DataLab ai database PostgreSQL, così come ad altri database SQL, è estremamente semplice. DataLab ti permette di connetterti alle fonti dati in modo sicuro. Allo stesso tempo, puoi proseguire senza soluzione di continuità la tua analisi dei dati con Python o R. Ti basta creare un’integrazione, seguendo un processo semplice e senza codice, in cui dovrai inserire le tue credenziali di connessione.

Infine, se vuoi provare l’integrazione ma non hai un database PostgreSQL a cui connetterti, puoi usare uno dei nostri database PostgreSQL di esempio!

Curioso di DataCamp DataLab? Dai un’occhiata a questo articolo per saperne di più su questo notebook di nuova generazione per la data science.

Conclusione

Ottimo lavoro! In questo tutorial hai preso confidenza con PostgreSQL e hai imparato a gestire i database senza uscire da Python, usando il pacchetto psycopg2. Ma questo è solo l’inizio del viaggio. SQL è uno dei linguaggi di programmazione più utilizzati nella data science. È anche abbastanza facile da imparare, quindi non hai scuse.

Per fortuna, Datacamp ti copre le spalle. Ecco alcune risorse che possono aiutarti a diventare fluente in PostgreSQL e in SQL in generale:

FAQs

Qual è la differenza tra psycopg2 e psycopg2-binary?

psycopg2 è il pacchetto sorgente e richiede l’installazione di un compilatore C e delle librerie client di PostgreSQL sul tuo sistema. psycopg2-binary è una versione precompilata che include tutto ciò che serve per iniziare subito. È ottimo per sviluppo e apprendimento, ma non è consigliato in produzione a causa di potenziali incompatibilità binarie.

Come gestisco gli errori di connessione al database in Python?

Puoi intercettare e gestire gli errori relativi alla connessione usando i blocchi try-except di Python. Per esempio:

import psycopg2
from psycopg2 import OperationalError

try:
    conn = psycopg2.connect(
        database="datacamp_courses",
        user="datacamp",
        password="postgresql_tutorial",
        host="localhost",
        port=5432
    )
except OperationalError as e:
    print(f"An error occurred: {e}")

Questo permette allo script di fallire in modo controllato e persino di ritentare la connessione se necessario.

Come mi connetto a un database PostgreSQL remoto invece che locale?

Per connetterti a un database PostgreSQL remoto, sostituisci localhost con l’indirizzo IP o il nome di dominio del server remoto. Assicurati che:

  • Il server del database consenta connessioni esterne.
  • La porta corretta (di solito 5432) sia aperta nel firewall.
  • Il file pg_hba.conf di PostgreSQL sia configurato per accettare connessioni remote.

Posso usare variabili d’ambiente per archiviare le credenziali del database in modo sicuro?

Sì, archiviare le credenziali come variabili d’ambiente è una pratica più sicura rispetto all’inserirle nel codice. Puoi accedervi in Python usando os.environ:

import os
conn = psycopg2.connect(
    database=os.environ["DB_NAME"],
    user=os.environ["DB_USER"],
    password=os.environ["DB_PASSWORD"],
    host=os.environ["DB_HOST"],
    port=os.environ["DB_PORT"]
)

Usa strumenti come i file .env con python-dotenv per gestirle in locale.

Come posso prevenire attacchi di SQL injection usando psycopg2?

Usa sempre le query parametrizzate invece della formattazione di stringhe quando inserisci dati dell’utente:

cur.execute("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES (%s, %s, %s)",
            ('Course Name', 'Instructor', 'Topic'))

Questo impedisce agli utenti malintenzionati di iniettare codice SQL dannoso nelle tue query.

Come aggiorno più righe in una volta sola in psycopg2?

Puoi usare il metodo executemany() per inserire o aggiornare più righe in modo efficiente:

courses = [
    ('Course A', 'Instructor A', 'Python'),
    ('Course B', 'Instructor B', 'R')
]
cur.executemany("INSERT INTO datacamp_courses(course_name, course_instructor, topic) VALUES (%s, %s, %s)", courses)

Quali tipi di dato sono disponibili in PostgreSQL e come si mappano in Python?

Ecco alcuni comuni tipi di dato PostgreSQL e i loro equivalenti in Python:

Tipo PostgreSQL Equivalente Python
INTEGER int
VARCHAR, TEXT str
BOOLEAN bool
DATE, TIMESTAMP datetime.date, datetime.datetime
NUMERIC decimal.Decimal

Come posso esportare dati da PostgreSQL a un CSV usando Python?

Puoi usare il metodo copy_expert() con un comando SQL COPY:

with open('courses.csv', 'w') as f:
    cur.copy_expert("COPY datacamp_courses TO STDOUT WITH CSV HEADER", f)

È utile per creare backup o esportare dati per l’analisi.

Posso usare Jupyter Notebook per eseguire questi comandi Python-PostgreSQL?

Assolutamente sì! psycopg2 funziona senza problemi in Jupyter. Assicurati solo che la connessione al database venga chiusa correttamente dopo le query, perché le sessioni di Jupyter possono restare aperte e consumare risorse.

Qual è il modo migliore per eseguire il debug delle query SQL che falliscono in Python?

Puoi:

  • Stampare la query e i parametri prima dell’esecuzione.
  • Usare i log di PostgreSQL per trovare più dettagli.
  • Abilitare il logging di psycopg2 impostando connection.set_isolation_level() o usando la modalità echo di SQLAlchemy se usi quella interfaccia.

Javier Canales Luna's photo
Author
Javier Canales Luna
LinkedIn

Sono una data analyst freelance e collaboro con aziende e organizzazioni di tutto il mondo in progetti di data science. Sono anche un'insegnante di data science con oltre 2 anni di esperienza. Scrivo regolarmente articoli su temi legati alla data science in inglese e spagnolo, alcuni dei quali sono stati pubblicati su siti affermati come DataCamp, Towards Data Science e Analytics Vidhya. Come data scientist con un background in scienze politiche e diritto, il mio obiettivo è lavorare all'intersezione tra politiche pubbliche, diritto e tecnologia, sfruttando la forza delle idee per promuovere soluzioni e narrazioni innovative che ci aiutino ad affrontare le sfide urgenti, in primis la crisi climatica. Mi considero autodidatta, una persona in continuo apprendimento e una convinta sostenitrice dell'approccio multidisciplinare. Non è mai troppo tardi per imparare cose nuove.

Argomenti
Python
Data Science
Analisi dei dati
SQL

Scopri di più su Python

Corso

Introduzione ai database in Python

4 ore
102.1K
In questo corso imparerai le basi dei database relazionali e come usarli.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra AltroMostra Altro