back to top

Python e MySQL: cancellare record, tabelle e database

Tra le procedure effettuate con una certa frequenza nella gestione dei database vi sono anche quelle che prevedono la rimozione di record, tabelle e delle basi di dati stesse. I comandi SQL da utilizzare possono differire a seconda dell’elemento che si desidera eliminare ed è sempre utile ricordare che questo tipo di operazioni sono irreversibili, quindi se non si dispone di copie di backup aggiornate i dati cancellati andranno definitivamente perduti.

Cancellazione dei record

Il linguaggio SQL mette a disposizione il comando DELETE FROM per la cancellazione dei record, la sua sintassi prevede di specificare il nome della tabella coinvolta ed eventualmente i criteri che consentiranno al DBMS di individuare i record che si desidera rimuovere. L’esempio proposto di seguito mostra il codice di uno script destinato a cancellare dalla tabella "nominativi" soltanto i record in cui il valore del campo "parentela" corrisponde alla stringa "nipote":

# 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 la cancellazione dei record
istruzione = "DELETE FROM nominativi WHERE parentela = %s"
valori = ("nipote", )
# Esecuzione dell'istruzione
cursore.execute(istruzione, valori)
# Applicazione delle modifiche
connessione.commit()
# Conteggio dei record coinvolti
print(cursore.rowcount)

Il funzionamento della piccola applicazione proposta non è molto dissimile da quello degli esempi presentati in precedenza. Anche in questo caso infatti il parametro di input introdotto tramite la clausola WHERE viene sottoposto ad escaping tramite il placeholder "%$", l’istruzione viene poi eseguita attraverso una chiamata al metodo execute() e le modifiche alla tabella vengono confermate tramite il metodo commit() privo di argomenti.

Una volta effettuata la rimozione richiesta è possibile eseguire tramite rowcount una verifica sul numero di record coinvolti dall’istruzione (nel nostro caso 2).

E’ inoltre possibile effettuare un controllo più completo sugli esiti della chiamata al comando DELETE FROM operando una rapida estrazione di tutti i dati presenti in tabella al momento corrente. Per far questo è sufficiente lanciare un’istruzione SQL basata sul comando SELECT in modo da ottenere una lista di tuple che, sottoposta ad un ciclo for, restituirà uno per uno tutti i record selezionati.

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

Dato che prima dell’esecuzione dell’istruzione di concellazione nella tabella erano presenti 5 record e che il comando DELETE FROM ne ha cancellati 2, questa volta dovremmo ottenere 3 record in output.

Sono stati cancellati infatti soltanto i record in cui il campo "parentela" era valorizzato come "nipote".

Rimozione di una tabella

Il comando di riferimento per la cancellazione delle tabelle presenti in un database MySQL non è DELETE FROM, utilizzabile esclusivamente per la rimozione dei record, ma DROP TABLES. Quest’ultimo deve essere seguito esclusivamente dal nome della tabella da eliminare, come nell’esempio seguente:

# Comando SQL per la cancellazione della tabella
cursore.execute("DROP TABLE nominativi")

Una volta passata l’istruzione desiderata al metodo execute() è possibile effettuare un controllo sulle tabelle effettivamente contenute nel database utilizzato (nel nostro caso "anagrafiche") tramite una chiamata al già noto comando SQL SHOW TABLES:

# Comando SQL per la visualizzazione delle tabelle
cursore.execute("SHOW TABLES")
# Visualizzazione delle tabelle
for i in cursore:
  print(i)

Dato che "nominativi" era l’unica tabella che avevamo creato in "anagrafiche", il ciclo a carico del cursore di connessione non restituirà in output alcun elemento.

Eliminazione di un database

L’ultimo comando di rimozione da analizzare per ottenere una panoramica completa è naturalmente quello relativo alla cancellazione dei database. Una base di dati creata tramite MySQL può essere eliminata in via definitiva utilizzando il comando SQL DROP DATABASE seguito dal nome del database da cancellare:

# Comando SQL per la cancellazione del database
cursore.execute("DROP DATABASE anagrafiche")

In questo caso è poi possibile ricorrere ad una semplice interrogazione basata sul comando SHOW DATABASES per visualizzare i nomi di tutti di database ancora disponibili tramite il DBMS dopo il lancio dell’istruzione.

# Comando SQL per la visualizzazione dei database
cursore.execute("SHOW DATABASES")
# Visualizzazione dei database
for i in cursore:
  print(i)

Dato che "anagrafiche" era l’unico database che abbiamo creato dopo l’installazione di MySQL, l’istruzione restituirà in output soltanto i nomi dei database di default della piattaforma.

Quando si deve gestire un gran numero di database o non se ne ricordano i nomi è possibile che vengano lanciate delle istruzioni di rimozione delle quali non si conosce l’esito a priori. Chiaramente è sempre disponibile il comando SHOW DATABASES per un eventuale controllo, se però si desidera procedere da subito con la cancellazione senza generare errori la clausola IF EXISTS consente di verificare da subito l’esistenza o meno della base di dati da eliminare:

# Comando SQL per la cancellazione del database
cursore.execute("DROP DATABASE IF EXISTS anagrafiche")

La medesima clausola può essere utilizzata anche per verificare l’esistenza di una tabella prima della sua cancellazione:

# Comando SQL per la cancellazione della tabella
cursore.execute("DROP TABLE IF EXISTS nominativi")
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.