Utenti Windows e macOS
I programmi riportati in questa pagina sono stati concepiti per il S.O. Windows.
Gli utenti macOS per poter eseguire con successo gli gli stessi programmi devono apportare la modifica riportata di seguito.
Sostituire l'istruzione
db_file = r"C:\SQLite\db\comuni\comuni.db"
con
from pathlib import Path
home = str(Path.home())
db_file = home+"/SQLite/db/comuni/comuni.db"
Query parametrizzata
Questa procedura illustra come effettuare una SELECT parametrizzata, cioè una query in cui il valore su cui filtrare è un parametro.
Esempio:
Codice sorgente
import sqlite3
from sqlite3 import Error
db_file = r"C:\sqlite\db\comuni\comuni.db"
try:
conn = sqlite3.connect("file:"+db_file+"?mode=rw", uri=True)
print("Connessione a", db_file, "avvenuta correttamente\n")
except Error as e:
print("Errore: ", e)
exit(1)
comune = input("Inserisci il nome di un comune italiano (es. Pompei): ")
sql_query = """
SELECT Comuni.Denominazione, Province.Denominazione,
Regioni.Denominazione
FROM Comuni, Province, Regioni
WHERE Comuni.ProvinciaID = Province.ProvinciaID AND
Province.regioneID = Regioni.RegioneID AND
Comuni.Denominazione = ?;
"""
try:
c = conn.cursor()
c.execute(sql_query, (comune,))
except Error as e:
print("Errore *****", e)
conn.close()
exit(1)
righe = c.fetchall()
for riga in righe:
print(riga[0], riga[1], riga[2])
conn.close()
Note:
La stringa che compone la query
sql_query = """
SELECT Comuni.Denominazione, Province.Denominazione,
Regioni.Denominazione
FROM Comuni, Province, Regioni
WHERE Comuni.ProvinciaID = Province.ProvinciaID AND
Province.regioneID = Regioni.RegioneID AND
Comuni.Denominazione = ?;
"""
include un punto interrogativo (?) che corrisponde al parametro in base al quale verrà effettuato il filtraggio.
Il punto interrogativo verrà risolto al momento dell'esecuzione della query.
La query richiede che il dato sia inserito rispettando maiuscole e minuscole.
Quando si esegue la query con il comando
c.execute(sql_query, (comune,))
il secondo argomento del metodo risolve il punto interrogativo inserito nella stringa che compone la query.
Il secondo argomento del metodo
c.execute(sql_query, (comune,))
è una tupla pertanto la virgola (,) dopo la variabile "comune" deve essere necessariamente inserita.
L'operatore di confronto LIKE
Nel precedente esempio il nome del comune deve essere inserito integralmente ed in modo esatto.
Nel prossimo esempio verrà utilizzato l'operatore di confronto LIKE in modo da filtrare in base ad una parte del nome, in questo caso solo le prime lettere.
Esempio:
Codice sorgente
import sqlite3
from sqlite3 import Error
db_file = r"C:\sqlite\db\comuni\comuni.db"
try:
conn = sqlite3.connect("file:"+db_file+"?mode=rw", uri=True)
print("Connessione a", db_file, "avvenuta correttamente\n")
except Error as e:
print("Errore: ", e)
exit(1)
comune = input("Inserisci solo le prime lettere del nome di un comune italiano (es. Torre): ")
sql_query = """
SELECT Comuni.Denominazione, Province.Denominazione,
Regioni.Denominazione
FROM Comuni, Province, Regioni
WHERE Comuni.ProvinciaID = Province.ProvinciaID AND
Province.regioneID = Regioni.RegioneID AND
Comuni.Denominazione LIKE ?;
"""
try:
c = conn.cursor()
c.execute(sql_query, (comune+'%',))
except Error as e:
print("Errore *****", e)
conn.close()
exit(1)
righe = c.fetchall()
for riga in righe:
print(riga[0], riga[1], riga[2])
conn.close()
Note:
Il parametro LIKE prevede che il confronto tra il dato contenuto in un campo ed una stringa sia fatto su una sottostringa. Il carattere "%" è utilizzato per indicare la parte che non influenza l'esito del confronto. Esempi:
"Torre del Greco" LIKE "Torre%" VERO
"Torre del Greco" LIKE "Greco%" FALSO
"Torre del Greco" LIKE "%Greco" VERO
"Torre del Greco" LIKE "Greco%" FALSO
"Torre del Greco" LIKE "%del Gre%" VERO
L'opzione NOCASE (Maiuscolo/Minuscolo)
Qualora si voglia effettuare una SELECT che nel confronto non faccia differenza tra caratteri minuscoli e maiuscoli, occorre aggiungere l'opzione COLLATE NOCASE come mostrato nell'esempio seguente:
Esempio:
Codice sorgente
import sqlite3
from sqlite3 import Error
db_file = r"C:\sqlite\db\comuni\comuni.db"
try:
conn = sqlite3.connect("file:"+db_file+"?mode=rw", uri=True)
print("Connessione a", db_file, "avvenuta correttamente\n")
except Error as e:
print("Errore: ", e)
exit(1)
comune = input("Inserisci solo le prime lettere del nome di un comune italiano (es. Torre): ")
sql_query = """
SELECT Comuni.Denominazione, Province.Denominazione,
Regioni.Denominazione
FROM Comuni, Province, Regioni
WHERE Comuni.ProvinciaID = Province.ProvinciaID AND
Province.regioneID = Regioni.RegioneID AND
Comuni.Denominazione LIKE ? COLLATE NOCASE;
"""
try:
c = conn.cursor()
c.execute(sql_query, (comune+'%',))
except Error as e:
print("Errore *****", e)
conn.close()
exit(1)
righe = c.fetchall()
for riga in righe:
print(riga[0], riga[1], riga[2])
conn.close()
Sito: 7ecnologie
Sezione: 09. Python
Capitolo: 02. Introduzione a Python
Paragrafo: 02. Query parametrizzate
Indice dei capitoli: 00. Risorse - 01. Ambiente di sviluppo - 02. Introduzione a Python - 03. Accesso al DB - 04. La libreria tkinter - 05. Tutorial - 98. Esercizi
Indice dei paragrafi: 01. Primi passi - 02. Query parametrizzate - 03. Query "voluminose" - 04. Inserimento di record