Inserire e Aggiornare Prodotti in SQLite con SQLAlchemy
Nel precedente articolo, Creare e Popolare
una Tabella Prodotto in SQLite con SQLAlchemy, abbiamo esplorato come
creare e popolare una tabella Prodotto
all'interno di un SQLite, utilizzando
SQLAlchemy. Questa guida ci ha fornito una buona base di partenza per lavorare
con i database in Python. Ora, desideriamo approfondire un aspetto cruciale:
gestire l'inserimento e l'aggiornamento dei record nel nostro database. È
fondamentale garantire che i dati rimangano coerenti e privi di duplicati,
specialmente quando si lavora con un elenco di prodotti.
Modifica del Campo Unico
Una delle prime modifiche che dobbiamo apportare è l'aggiunta di un vincolo
di unicità sul campo titolo
della nostra classe Prodotto
. Questo ci
permetterà di evitare la creazione di record duplicati nel database.
Aggiungendo unique=True
alla definizione del campo titolo, assicuriamo che
ogni prodotto abbia un nome unico. Questo cambiamento è fondamentale per
mantenere l'integrità dei dati e prevenire conflitti in futuro. In questo
modo, se proviamo a inserire un prodotto con un titolo già esistente, il
database solleverà un'eccezione, consentendoci di gestire la situazione in modo
appropriato.
Creazione della Funzione inserisci_o_aggiorna_prodotto
Una volta che abbiamo impostato il vincolo di unicità, è il momento di
implementare una logica che ci consenta di gestire in modo efficace
l'inserimento e l'aggiornamento dei prodotti. Qui entra in gioco la creazione
di una funzione chiamata inserisci_o_aggiorna_prodotto
. Questa funzione avrà
un ruolo cruciale nella nostra applicazione, poiché si occuperà di cercare un
prodotto esistente nel database in base al titolo fornito.
La funzione inizia cercando un prodotto utilizzando il metodo filter_by
di
SQLAlchemy. Se trova un prodotto con lo stesso titolo, procederà ad aggiornare
i campi prezzo
e note
. Se, invece, non trova alcun prodotto corrispondente,
creerà un nuovo record. Questo approccio semplifica notevolmente la gestione
dei dati, poiché ci consente di eseguire sia l'inserimento che l'aggiornamento
con un'unica chiamata alla funzione.
Ecco un esempio di come può essere strutturata questa funzione:
def inserisci_o_aggiorna_prodotto(session, titolo, prezzo, note):
# Cerca un prodotto esistente con lo stesso titolo
prodotto = session.query(Prodotto).filter_by(titolo=titolo).first()
if prodotto:
# Se il prodotto esiste, aggiorna i suoi dati
prodotto.prezzo = prezzo
prodotto.note = note
print(f"Prodotto '{titolo}' aggiornato.")
else:
# Se il prodotto non esiste, creane uno nuovo
nuovo_prodotto = Prodotto(titolo=titolo, prezzo=prezzo, note=note)
session.add(nuovo_prodotto)
print(f"Prodotto '{titolo}' inserito.")
# Salva le modifiche nel database
session.commit()
In questo frammento di codice, la funzione cerca un prodotto esistente. Se lo
trova, aggiorna i suoi attributi; altrimenti, crea un nuovo oggetto Prodotto e
lo aggiunge alla sessione. Questo metodo garantisce che tutte le modifiche
siano salvate nel database con un semplice session.commit()
.
Codice Completo
Dopo aver implementato la funzione inserisci_o_aggiorna_prodotto
, possiamo
utilizzare un elenco di prodotti per testare il nostro sistema. Di seguito,
presentiamo il codice completo che integra tutte le modifiche di cui abbiamo
parlato.
from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.orm import declarative_base, sessionmaker
# Definizione della base
Base = declarative_base()
# Modifica del modello Prodotto
class Prodotto(Base):
__tablename__ = 'prodotto'
id = Column(Integer, primary_key=True, autoincrement=True)
titolo = Column(String(100), nullable=False, unique=True) # Vincolo di unicità aggiunto
prezzo = Column(Float, nullable=False)
note = Column(String(200))
# Configurazione del motore di database
engine = create_engine('sqlite:///prodotti.db')
# Creazione della sessione
Session = sessionmaker(bind=engine)
session = Session()
# Creazione delle tabelle
Base.metadata.create_all(engine)
def inserisci_o_aggiorna_prodotto(session, titolo, prezzo, note):
# Cerca un prodotto esistente con lo stesso titolo
prodotto = session.query(Prodotto).filter_by(titolo=titolo).first()
if prodotto:
# Se il prodotto esiste, aggiorna i suoi dati
prodotto.prezzo = prezzo
prodotto.note = note
print(f"Prodotto '{titolo}' aggiornato.")
else:
# Se il prodotto non esiste, creane uno nuovo
nuovo_prodotto = Prodotto(titolo=titolo, prezzo=prezzo, note=note)
session.add(nuovo_prodotto)
print(f"Prodotto '{titolo}' inserito.")
# Salva le modifiche nel database
session.commit()
# Lista di prodotti da inserire o aggiornare
prodotti = [
{'titolo': 'Prodotto 1', 'prezzo': 10.99, 'note': 'Nota 1'},
{'titolo': 'Prodotto 2', 'prezzo': 20.99, 'note': 'Nota 2'},
{'titolo': 'Prodotto 3', 'prezzo': 30.99, 'note': 'Nota 3'},
{'titolo': 'Prodotto 4', 'prezzo': 40.99, 'note': 'Nota 4'},
{'titolo': 'Prodotto 5', 'prezzo': 50.99, 'note': None},
{'titolo': 'Prodotto 6', 'prezzo': 60.99, 'note': None},
{'titolo': 'Prodotto 7', 'prezzo': 70.99, 'note': 'Nota 7'},
{'titolo': 'Prodotto 8', 'prezzo': 80.99, 'note': 'Nota 8'},
{'titolo': 'Prodotto 9', 'prezzo': 90.99, 'note': 'Nota 9'},
{'titolo': 'Prodotto 1', 'prezzo': 100.99, 'note': 'Nota 10'},
]
# Inserimento o aggiornamento dei prodotti nel database
for prodotto_data in prodotti:
inserisci_o_aggiorna_prodotto(
session,
prodotto_data['titolo'],
prodotto_data['prezzo'],
prodotto_data['note']
)
print("Tabella Prodotto creata e popolata con successo!")
Conclusioni
Con queste modifiche, ora abbiamo un sistema robusto per gestire l'inserimento
e l'aggiornamento dei prodotti nel nostro database. La funzione
inserisci_o_aggiorna_prodotto
ci consente di mantenere i dati coerenti e di
evitare duplicati, rendendo il nostro codice più efficiente e facile da
gestire. Speriamo che questa guida vi sia stata utile e vi incoraggi a
esplorare ulteriormente le potenzialità di SQLAlchemy nella gestione dei vostri
dati.