Post Image

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.