Una volta creata una tabella con i relativi campi è possibile popolarla tramite l’inserimento dei dati. Quando si gestisce un database MySQL tale operazione può essere effettuata utilizzando il comando INSERT INTO seguito dal nome della tabella e da quelli dei campi coinvolti nell’inserimento separati da una virgola e delimitati da parentesi tonde. I valori da assegnare ai campi devono essere introdotti invece dalla keyword VALUES, anch’essi tra parantesi e separati da una virgola.
Inserimento dei dati
Per analizzare le modalità con cui inserire dei dati in una tabella tramite Python è possibile partire da uno script completo come 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'inserimento del record
istruzione = "INSERT INTO nominativi (nome, cognome, parentela) VALUES (%s, %s, %s)"
valori = ("Rick", "Sanchez", "nonno")
# Esecuzone dell'istruzione
cursore.execute(istruzione, valori)
# Applicazione delle modifiche
connessione.commit()
# Conteggio dei record inseriti
print(cursore.rowcount)
Nell’introduzione di questa lezione abbiamo anticipato che la sintassi del comando SQL INSERT TO prevede che i valori da assegnare ai campi debbano essere introdotti dalla keyword VALUES, nel codice proposto ciò non avviene (o meglio avviene ma tramite un passaggio intermedio) introducendo un’espressione alternativa a quella attesa che avrebbe dovuto avere una forma come la seguente:
# Comando SQL per l'inserimento del record
istruzione = "INSERT INTO nominativi (nome, cognome, parentela) VALUES ("Rick", "Sanchez", "Nonno")"
Considerando che entrambe le sintassi sono corrette, perché è stata preferita quella che prevede innanzitutto la sostituzione dei valori con dei placeholder ("%$") e poi la loro introduzione come elementi di una tuple ("valori")?
# Comando SQL per l'inserimento del record
istruzione = "INSERT INTO nominativi (nome, cognome, parentela) VALUES (%s, %s, %s)"
valori = ("Rick", "Sanchez", "nonno")
La ragione di questa scelta deve essere ricercata nella necessità di prevenire gli attacchi basati sulla tecnica della SQL Injection, essa consiste nell’iniettare del codice malevolo in un’istruzione SQL con lo scopo di violare un database o causare altri danni come l’inserimento arbitrario di dati, la loro modifica o cancellazione. Azioni di questo tipo possono divenire particolarmente semplici quando gli input inviati da un’applicazione ad un DBMS, come appunto i paramenti di un’istruzione, non vengono controllati adeguatamente.
I placeholder consentono di effettuare l’escaping dei valori, dove con il termine "escaping" s’intende l’eliminazione dai parametri di inpt di qualsiasi elemento di ambiguità che potrebbe generare dei comportamenti imprevisti.
Una volta superata questa fase è possibile passare all’esecuzione dell’istruzione tramite il metodo execute() che accetta come argomenti la variabile istruzione (con i placeholder in sostituzione dei valori) e la tuple valori contenente i valori da inserire. Perché l’inserimento di questi ultimi divenga definitivo è però necessaria una chiamata al metodo commit() che ha il compito di applicare i cambiamenti desiderati alla tabella.
Da segnalare infine il ricorso a rowcount che consente di ottenere il conteggio dei record (in questo caso solo 1) coinvolti dall’istruzione.
Aggiornare i record
Dopo aver inserito uno o più record in una tabella è sempre possibile che si presenti la necessità di dover applicare delle modifiche aggiornando i valori presenti in uno o più campi. Per far questo SQL mette a disposizione il comando UPDATE che deve essere seguito dal nome della tabella e dalla keyword SET che introduce i campi da sottoporre all’aggiornamento. La clausola WHERE consente infine di introdurre un criterio con cui indicare con precisione il record o i record che dovranno subire la modifica.
Nel caso specifico dell’esempio seguente viene lanciata un’istruzione SQL con lo scopo di aggiornare la tabella "nominativi" impostando un nuovo valore per il campo "occupazione" in corrispondenza del record che ha il campo "id_nominativi" con valore "1".
# Comando per l'aggiornamento del record
istruzione = "UPDATE nominativi SET occupazione = %s WHERE id_nominativi = %s"
valori = ("scienziato", 1)
# Esecuzone dell'istruzione
cursore.execute(istruzione, valori)
# Applicazione delle modifiche
connessione.commit()
Quando si utilizza il comando UPDATE per aggiornare dei record specifici è assolutamente necessario ricordarsi di utilizzare la clausola WHERE, altrimenti i cambiamenti richiesti verranno applicati indiscriminatamente a tutti record.
Inserire più record con una sola istruzione
Nel precedente esempio basato su comando INSERT INTO abbiamo analizzato il codice utilizzabile per l’aggiunta di un singolo record ma, naturalmente, è anche possibile creare script che determinino l’inserimento simultaneo di più record. A tal proposito è possibile prendere in considerazione il codice seguente:
# Comando SQL per l'inserimento dei record
istruzione = "INSERT INTO nominativi (nome, cognome, parentela, occupazione) VALUES (%s, %s, %s, %s)"
valori = [
('Morty', 'Smith', 'nipote', 'studente'),
('Summer', 'Smith', 'nipote', 'studentessa'),
('Beth', 'Sanchez in Smith', 'figlia', 'veterinaria'),
('Jerry', 'Smith', 'genero', 'disoccupato')
]
# Esecuzone dell'istruzione
cursore.executemany(istruzione, valori)
# Applicazione delle modifiche
connessione.commit()
# Conteggio dei record inseriti
print(cursore.rowcount)
In esso i valori vengono introdotti tramite una lista di tuple, ognuna di esse presenta tanti elementi quanti sono i placeholder introdotti da VALUES. Da notare inoltre che questa volta il metodo richiamato per l’esecuzione dell’istruzione non è execute() ma executemany() che, appunto, consente di eseguire più istruzioni SQL alla volta.
Anche in questo caso il metodo rowcount() permette di visualizzare il numero dei record coinvolti dall’istruzione che sono 4 esattamente come sono 4 le tuple contenute nella lista valori.