04. Inserimento di record

Utenti Windows e macOS

I programmi riportati in questa pagina sono stati concepiti per il S.O. Windows.

Gli utenti Mac OS X 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"


Aggiornamento del database

La procedura seguente illustra come eseguire le seguenti operazioni:

    • Creare una tabella nel database, se la tabella ancora non esiste

    • Eseguire una INSERT parametrizzata per aggiungere un record in una tabella

    • Aggiungere un record in una tabella associativa, inserendo le chiavi esterne preventivamente acquisite.

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)

# Se non esistono nel DB crea le tabelle Attrazioni e Localizzare

sql_create1 = """

CREATE TABLE IF NOT EXISTS Attrazioni (

AttrazioneID INTEGER PRIMARY KEY,

Denominazione TEXT NOT NULL,

Descrizione TEXT);

"""

sql_create2 = """

CREATE TABLE IF NOT EXISTS Localizzare (

AttrazioneID INTEGER NOT NULL,

ComuneID INTEGER NOT NULL,

FOREIGN KEY(AttrazioneID)

REFERENCES Attrazioni(AttrazioneID),

FOREIGN KEY(ComuneID)

REFERENCES Comuni(ComuneID),

PRIMARY KEY (AttrazioneID, ComuneID));

"""

try:

c = conn.cursor()

c.execute(sql_create1)

c.execute(sql_create2)

print("Tabelle Attrazioni e Localizzare create correttamente\n")

except Error as e:

print("Errore *****", e)

conn.close()

exit(1)

# Abilita il controllo sulle Foreign Keys

print("PRAGMA foreign_keys = ON\n")

sql_pragma = """

PRAGMA foreign_keys = ON;

"""

try:

c.execute(sql_pragma)

except Error as e:

print("Errore *****", e)

conn.close()

exit(1)

# Acquisisce il nome di un'attrazione e la inserisce in tabella

attrazione = input("Inserisci il nome di un'attrazione: ")

descrizione = input("Inserisci la descrizione dell'attrazione: ")

sql_insert = """

INSERT INTO Attrazioni VALUES(null, ?, ?);

"""

try:

c.execute(sql_insert, (attrazione, descrizione))

AttrazioneID = c.lastrowid

except Error as e:

print("Errore *****", e)

conn.close()

exit(1)

# Chiede di inserire una lista di Comuni da associare all'attrazione

print("Inserisci una lista di comuni separati da virgole da associare all'attrazione: ")

elenco = input()

comuni = elenco.split(",")

for comune in comuni:

sql_query = """

SELECT ComuneID, Denominazione

FROM Comuni

WHERE Denominazione = ?;

"""

try:

c = conn.cursor()

comune = comune.strip()

c.execute(sql_query, (comune,))

righe = c.fetchall()

except Error as e:

print("Errore *****", e)

conn.close()

exit(1)

try:

for riga in righe:

sql_insert = """

INSERT INTO Localizzare VALUES(?, ?);

"""

ComuneID = riga[0]

ComuneDenominazione = riga[1]

c.execute(sql_insert, (AttrazioneID, ComuneID))

print(attrazione, "<->", ComuneDenominazione)

except Error as e:

print("Errore *****", e)

conn.close()

exit(1)

conn.commit()

conn.close()

Note:

  • Il comando di INSERT utilizzato per inserire una nuova attrazione in tabella, non specifica il valore della chiave ma utilizza NULL. Questo fa sì che la chiave venga generata automaticamente all'inserimento

sql_insert = """

INSERT INTO Attrazioni VALUES(null, ?, ?);

"""

    • Dopo aver inserito una nuova attrazione nella tabella Attrazioni, il valore della chiave deve essere rilevato perché necessario ad effettuare un inserimento nella tabella associativa Localizzare. Il valore della chiave è ottenuto tramite l'istruzione

AttrazioneID = c.lastrowid

    • Per creare l'associazione tra un'attrazione e l'elenco di comuni indicati dall'utente, occorre ottenere la chiave primaria di tali comuni. A tale scopo è effettuata la query

sql_query = """

SELECT ComuneID, Denominazione

FROM Comuni

WHERE Denominazione = ?;

"""

    • Quando l'utente inserisce l'elenco di comuni separati da virgole, il programma acquisisce il dato come unica stringa. Per una corretta elaborazione la stringa va trasformata in lista. Questa operazione è effettuata con le operazioni

elenco = input()

comuni = elenco.split(",")

Ogni elemento della lista comuni così ottenuta, può contenere degli spazi all'inizio o alla fine del nome (l'utente potrebbe aver scritto Pompei, Ercolano ,Portici). Per eliminare gli spazi ad inizio o alla fine della parola si utilizza l'istruzione

comune = comune.strip()