Python & MySQL
Per sviluppare applicazioni in Python con interazione con un DBMS servono sostanzialmente 2 cose:
- un modulo Python per il collegamento con il DBMS
- l'installazione di un DBMS per il testing dell'applicazione
Modulo Python
Il modulo necessario per le implementazioni che vedremo si chiama "MySQL Connector". Per l'installazione dello stesso basta utilizzare pip, con il comando indicato sotto
$ pip install mysql-connector
oppure dalla linea di comando, invocando l'interprete Python
$ python -m pip install mysql-connector
I comandi elencati funzionano sicuramente su Linux e Mac. Su Windows dipende da come è stata fatta l'installazione di Python e in particolare se l'eseguibile Python è stato inserito nel PATH.
Se così non fosse bisogna spostarsi con la console della riga di comando fino alla cartella di installazione di Python ed eseguire il comando sopra da lì.
Ad esempio se l'installazione è stata fatta su C:\Python
, allora il comando va
eseguito in quella cartella.
Per verificare che l'installazione del modulo è andata a buon fine basta aprire l'interprete Python e provare a importare il modulo:
>>> import mysql.connector
Se Python non si lamenta di nulla, siamo pronti per il prossimo step :)
Installazione DBMS
Per testare il codice che scriveremo dobbiamo installare un DBMS. Bene... installeremo MariaDB! Cioè... come scusa? Non installiamo MySQL? E tutti discorsi fatti fino ad ora? E... il titolo di questa dispensa???
Provo a spiegare con una frase: MariaDB è un software libero nato come fork di MySQL e studiato come Drop-In Replacement dello stesso. Credo che come spiegazione sia un po' criptica ma sufficientemente esaustiva :)
Se volete maggiori informazioni sulle motivazioni della scelta, vi rimando alla loro pagina wikipedia: https://it.wikipedia.org/wiki/MariaDB.
Per installare MariaDB basta seguire le istruzioni che trovate nel loro sito ufficiale: https://mariadb.org/
Connessione al DB
Cominciamo stabilendo una connessione fra il nostro script Python e il database:
import mysql.connector
pydb = mysql.connector.connect(
host="localhost",
user="username",
passwd="password",
database="dbname"
)
Ovviamente se c'è un problema qualunque nella connessione questo pezzo di codice fallirà. E sarà inutile andare avanti...
DDL execution
DDL (Data Definition Language) è quella parte di codice SQL che serve
per la definizione dei dati. Per estrema semplicità dirò semplicemente
che DDL si riferisce ai comandi SQL CREATE
(ad esempio: CREATE
TABLE...), ALTER
, DROP
.
Questo tipo di comandi non ritornano "valori" o tabelle come risultato, ma generano semplicemente una risposta del tipo "OK, tutto fatto!" oppure "Mannaggia, qualcosa è andato storto!!!".
Per eseguire questo tipo di comandi abbiamo bisogno di un "cursore" che si occupi di attualizzare l'istruzione descritta.
DML execution
DML (Data Manipulation Language) è quella parte di codice SQL che serve
per la manipolazione dei dati. Per estrema semplicità dirò semplicemente
che DML si riferisce ai comandi SQL INSERT
, UPDATE
, DELETE
.
Questo tipo di operazioni sulle tabelle del database non modifica in alcun modo la struttura dello stesso, ma si occupa semplicemente di andare ad aggiungere, modificare, eliminare dati dalla tabella.
Per eseguire i comandi abbiamo ancora bisogno di un cursore. Vediamo l'esempio:
Inserimento di un valore
pycur = pydb.cursor()
for n in range(1,11):
sql = 'INSERT INTO tbl_seven(number) VALUES (' + str(n*7) + ')'
pycur.execute(sql)
# per applicare l'aggiornamento dei dati, va fatto il commit sul DB
pydb.commit()
QL execution
QL (Query Language) è quella parte di codice SQL che serve per
l'interrogazione dei dati. Per estrema semplicità dirò semplicemente che
QL si riferisce al comando SQL SELECT
.
Questo tipo di operazioni sulle tabelle del database genera come risultato una tabella "provvisoria" contenente il risultato dell'interrogazione.
Neanche a dirlo, per eseguire i comandi abbiamo ancora bisogno di un cursore. Vediamo l'esempio:
pycur = pydb.cursor()
sql = "SELECT number FROM tbl_seven WHERE number % 2 = 0"
pycur.execute(sql)
results = pycur.fetchall()
for r in results:
print(r)
Tutto qua!
Rimane da provare e sperimentare un po'...