Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 49 di 58
  • livello intermedio
Indice lezioni

Python: API per l'accesso al DB

Interagire con un database MySQL tramite il linguaggio di programmazione Python, utilizzando le DB-API e la relativa interfaccia per MySQL.
Interagire con un database MySQL tramite il linguaggio di programmazione Python, utilizzando le DB-API e la relativa interfaccia per MySQL.
Link copiato negli appunti

Anche il linguaggio di programmazione Python permette agli sviluppatori di interfacciarsi con MySQL in maniera relativamente semplice. Il team di sviluppo ha messo a disposizione di tutti una linea guida standard per l'interfacciamento con i database, chiamata DB-API. In questa lezione vedremo come utilizzare una delle implementazioni di questo standard, chiamata MySQLdb.

Installare MySQLdb

La prima cosa da fare è verificare se la suddetta interfaccia è già installata. Per farlo, creiamo lo script seguente (o, equivalentemente, utilizziamo l'interprete interattivo):

#!/usr/bin/python
import MySQLdb

Se otterremo il messaggio seguente:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    import MySQLdb
ImportError: No module named MySQLdb

vuol dire che il modulo non è installato. Per risolvere il problema, possiamo procedere in vari modi. Su Ubuntu e Fedora, ad esempio, possiamo installare rispettivamente i pacchetti .deb e .rpm come segue:

# Ubuntu
$ sudo apt-get install python-pip python-dev libmysqlclient-dev
# Fedora
$ sudo dnf install python python-devel mysql-devel redhat-rpm-config gcc

In alternativa, possiamo fare ricorso al gestore dei pacchetti Python pip, digitando da riga di comando quanto segue:

pip install MySQL-python

Connessione al database

Vediamo subito un esempio pratico, in cui mostreremo come connetterci ad un databse MySQL. Immaginiamo di volerci connettere al database TEST, con l'utente root la cui password è password. Per semplicità, una volta effettuata la connessione, eseguiremo una semplice operazione di lettura.

Di seguito il codice:

#!/usr/bin/python
import MySQLdb
# Connessione al Database
db = MySQLdb.connect("localhost","root","password","TEST" )
# Ottenimento del cursore
cursor = db.cursor()
# Esecuzione di una query SQL
cursor.execute("SELECT VERSION()")
# Lettura di una singola riga dei risultati della query
data = cursor.fetchone()
print "Database version : %s " % data
# Disconnessione
db.close()

Come si vede, l'utilizzo è abbastanza semplice ed intuitivo. Una volta eseguito il metodo connect(), l'oggetto ritornato viene utilizzato per ottenere un cursore (tramite il metodo cursor()). Come avviene in altri linguaggi di programmazione, questo oggetto consente sia di eseguire una query (per mezzo del metodo execute()), sia di leggerne i risultati. Nell'esempio precedente, poichè l'unica riga che ci interessava leggere era la prima (e unica), è stato sufficiente usare il metodo fetchone(). Ovviamente, al termine delle operazioni, è bene chiudere la connessione per mezzo del metodo close().

Leggere risultati multipli

Supponiamo ora di effettuare una query che offre un numero maggiore di risultati, e vediamo come leggerli.

Mentre prima è stato sufficiente utilizzare il metodo fetchone(), questa volta dovremo ricorrere ad altro:

  • metodo fetchall(): legge tutti i risultati, e li ritorna in un unico insieme;
  • attributo rowcount: di sola lettura, ritorna il numero dei risultati ottenuti dalla query per mezzo del metodo execute().

L'esempio seguente, autoesplicativo, chiarisce in che modo utilizzare il metodo fetchall() per leggere tutti i risultati di una query. In particolare, vogliamo ottenere le entry di una tabella chiamata PERSONA, il cui attibuto ETA abbiamo valore maggiore di 17.

#!/usr/bin/python
import MySQLdb
db = MySQLdb.connect("localhost","root","password","TEST" )
cursor = db.cursor()
# Query SQL di selezione
sql = "SELECT * FROM PERSONA \
       WHERE ETA > '%d'" % (17)
try:
   # Esecuzione della query
   cursor.execute(sql)
   # Risultati della query
   results = cursor.fetchall()
   for row in results:
      nome = row[0]
      cognome = row[1]
      eta = row[2]
      sesso = row[3]
      print "nome=%s,cognome=%s,età=%d,sesso=%s" % \
             (nome, cognome, eta, sesso)
except:
   print "Errore"
db.close()

Come anticipato, l'esempio è abbastanza autoesplicativo: è sufficiente leggere i valori ottenuti dal metodo fetchall() come si fa con un normale array.

INSERT, UPDATE e DELETE

Abbiamo visto come effettuare la lettura dei dati; adesso non rimane che capire in che modo eseguire le altre operazioni principali: INSERT, UPDATE e DELETE. Dal momento che la loro esecuzione in Python differisce unicamente per la query vera e propria (cosa che è analogamente applicabile anche a query di creazione e modifica del database), considereremo per semplicità la sola operazione di UPDATE.

Nel seguito, aggiorneremo tutte le righe della tabella PERSONA (già utilizzata poc'anzi) in cui il valore del campo SESSO è pari a M. In particolare, aggiorneremo il valore dei campi ETA delle righe selezionate, incrementandoli di una unità.

#!/usr/bin/python
import MySQLdb
db = MySQLdb.connect("localhost","root","password","TEST" )
cursor = db.cursor()
# Query di UPDATE
sql = "UPDATE PERSONA SET ETA = ETA + 1
                          WHERE SESSO = '%c'" % ('M')
try:
   # Esecuzione della query SQL
   cursor.execute(sql)
   # Commit
   db.commit()
except:
   # Rollback in caso di errore
   db.rollback()
db.close()

È bene notare l'importanza di gestire eventuali errori di esecuzione: a tal proposito, ci viene in aiuto il metodo rollback(), che risulta ancora più utile nel caso si volessero effettuare transazioni, al fine di garantire le proprietà ACID di cui abbiamo già parlato in questa guida.

Approfondimenti

Per ogni ulteriore curiosità e approfondimento, è possibile consultare la documentazione ufficiale, relativa sia alle DB-API, sia all'interfacciamento con MySQL.

Ti consigliamo anche