back to top

Python e MySQL: selezione dei record

Dopo aver inserito i dati all’interno di una tabella una delle operazioni più frequenti a carico dei database è quella relativa alla selezione dei dati che, in questo modo, possono essere estratti in toto o sulla base di determinati criteri per la stampa a video, le attività di analisi o altre elaborazioni.

Il modulo di Python per l’interazione con MySQL dedicata a queste procedure metodi diversi che si differenziano sulla base del numero di recond coinvolti. Per quanto riguarda invece il DBMS, il comando di riferimento è SELECT che introduce i campi da selezionare e consente di specificare la tabella su cui operare tramite la clausola FROM. Ulteriori clausole, come la già analizzata WHERE, consentono infine di raffinare le interrogazioni inviate al database (query) incrementando la precisione degli output.

Estrazione dei record con il metodo fetchall()

Quando si desidera selezionare i record di alcuni campi di una tabella questi ultimi devono essere specificati uno a uno, se invece la selezione deve avvenire su tutti i campi è suffciente utilizzare al loro posto il carattere "*" senza la necessità di doverlii elencare uno per volta. Un semplice esempio di SELECT basata su "*" e successiva estrazione potrebbe essere il seguente:

# Importazione del modulo MySQL
import mysql.connector
# Connessione a MySQL
connessione = mysql.connector.connect(
# Parametri per la connessione
  host="localhost",
  user="<em>nome-utente</em>",
  password="<em>password</em>"
  db="anagrafiche"
)
# Generazione del cursore
cursore = connessione.cursor()
# Comando SQL per l'estrazione dei record
cursore.execute("SELECT * FROM nominativi")
# Visualizzazione dei record
risultati = cursore.fetchall()
for i in risultati:
  print(i)

dove la sintassi:

"SELECT * FROM nominativi"

sostituisce la forma estesa (e comunque corretta):

"SELECT id_nominativi, nome, cognome, parentela, occupazione  FROM nominativi"

Una volta formulata la query, e passata quest’ultima al metodo execute(), è possibile passare alla fase di estrazione dei record tramite una chiamata al metodo fetchall() che non richiede il passaggio di parametri. fetchall() genera una lista di tuple dove ad ogni tuple corrisponde un determinato record. Tale lista può essere infine sottoposta ad un ciclo per restituire i record in output come evidenziato dall’immagine seguente:

Da notare come in Python le query basate sul comando SELECT non richiedano l’utilizzo del metodo commit() in quanto non applicano alcuna modifica a carico dei dati o della loro struttura.

Estrazione di un singolo record

In alcuni casi può essere utile estrarre un solo record anche quando si effettua una query che potrebbe coinvolgerne molteplici o addirittura tutti quelli presenti in una tabella. A tale scopo Python mette a disposizione il metodo fetchone() che restituisce una singola tuple o nessuna nel caso in cui non sia possibile inserire alcun record nel risultato generato dalla chiamata al metodo.

L’esempio proposto in precedenza, e basato su fetchall(), potrebbe essere quindi riproposto in questo modo utilizzando fetchone():

# Comando SQL per l'estrazione del record
risultato = cursore.fetchone()
# Visualizzazione del record
print(risultato)

Non essendo presente nella query alcuna clausola WHERE che specifichi il record da selezionare, ad essere restituito in output è il primo record registrato in tabella (quello con valore della chiave primaria pari ad "1") che essendo contenuto in una sola tuple può essere stampato a video senza il ricorso ad un cliclo.

fetchone() può essere richiamato più volte all’interno dello stesso script, ad ogni chiamata però il cursore generato tramite il metodo cursor() viene ricollocato in modo da occupare la posizione successiva. Se quindi, come nel caso dell’esempio proposto, la prima chiamata a fetchone() dovesse restituire il record con identificatore "1", le seconda restituirebbe il record con identificatore "2" o quello successivo ancora disponibile nel caso esso sia stato rimosso.

Estrazione di record con clausola WHERE

Così come altre operazioni a carico dei database, anche quelle basate sul comando SELECT possono presentare clausole che permettono di specificare i record che devono essere coinvolti. Il codice seguente mostra ad esempio uno script in cui la clausola WHERE determina l’estrazione dei soli recordo in cui il valore del campo "cognome" è "Smith":

# Comando SQL per l'estrazione dei record
istruzione = "SELECT * FROM nominativi WHERE cognome = %s"
valori = ("Smith", )
# Esecuzione del comando SQL
cursore.execute(istruzione, valori)
# Visualizzazione del record
risultati = cursore.fetchall()
for i in risultati:
  print(i)

Ne consegue che questa volta i record estratti tramite chiamata al metodo fetchall() saranno solo 3, tanti quanti sono quelli in cui il campo "cognome" presenta una corrispondenza con il criterio precedentemente espresso in query.

Se infine l’esigenza è quella di estrarre uno specifico numero di record, anche senza l’utilizzo di una clausola che specifichi dei criteri di selezione, è possibile fare ricorso al metodo fetchmany() che accetta come argomento il cosiddetto parametro size, sostanzialmente un valore numerico intero che rappresenta la quantità di record che devono essere estratti:

# Comando SQL per l'estrazione dei record
cursore.execute("SELECT * FROM nominativi")
# Visualizzazione dei record
risultati = cursore.fetchmany(2)
for i in risultati:
  print(i)

Nell’esempio proposto i record estratti sono 2 contenuti in altrettante tuple i cui elementi vengono stampati a video tramite un ciclo, nel caso in cui non venga estratto alcun record il metodo restituirà una lista vuota.

Pubblicitร 
Claudio Garau
Claudio Garau
Web developer, programmatore, Database Administrator, Linux Admin, docente e copywriter specializzato in contenuti sulle tecnologie orientate a Web, mobile, Cybersecurity e Digital Marketing per sviluppatori, PA e imprese.