Python - Accesso ai Database

Ciao a tutti, aspiranti programmatori Python! Sono entusiasta di essere il vostro guida in questo avventuroso viaggio nell'universo dell'accesso ai database utilizzando Python. Come chi ha insegnato la programmazione per anni, posso assicurarvi che questa competenza non solo è essenziale, ma anche incredibilmente potente. Quindi, immergiamoci e scopriamo i segreti della manipolazione dei database con Python!

Python - Database Access

Accesso ai Database in Python

Immagina di organizzare una grande biblioteca. Hai migliaia di libri e hai bisogno di un sistema per tenerne traccia. In pratica, questo è ciò che fa un database, ma per informazioni digitali. Python, essendo la lingua versatile che è, offre diversi modi per interagire con i database. Oggi ci concentriamo su due metodi popolari: l'uso del modulo sqlite3 per database SQLite e il modulo PyMySQL per database MySQL.

Il Modulo sqlite3

SQLite è come un mini database integrato con Python. È perfetto per piccole applicazioni o quando si inizia. Iniziamo importando il modulo:

import sqlite3

Questa riga è come dire a Python: "Ehi, lavoreremo con database SQLite, quindi preparati!"

L'Oggetto di Connessione

Per lavorare con un database, dobbiamo prima connetterci ad esso. Pensatelo come bussare alla porta della vostra biblioteca digitale. Ecco come facciamo:

conn = sqlite3.connect("example.db")

Questa riga crea un nuovo file di database chiamato "example.db" se non esiste, oppure lo apre se esiste. La variabile conn è la nostra chiave per questo database.

L'Oggetto Cursor

Ora che siamo all'interno della nostra biblioteca digitale, abbiamo bisogno di un modo per muoverci e manipolare le cose. Questo è il lavoro di un cursore. Creiamone uno:

cursor = conn.cursor()

Pensate al cursore come al vostro assistente bibliotecario, pronto a recuperare o modificare informazioni al vostro comando.

Creazione di una Tabella del Database

Creiamo una tabella per memorizzare alcune informazioni. Immagina che stiamo catalogando libri:

cursor.execute('''CREATE TABLE IF NOT EXISTS books
(id INTEGER PRIMARY KEY,
title TEXT,
author TEXT,
year INTEGER)''')

Questo comando SQL crea una tabella chiamata "books" con colonne per id, title, author e year. La parte IF NOT EXISTS assicura che non creiamo per errore tabelle duplicate.

Operazione INSERT

Ora, aggiungiamo alcuni libri al nostro database:

cursor.execute("INSERT INTO books (title, author, year) VALUES (?, ?, ?)",
("To Kill a Mockingbird", "Harper Lee", 1960))
conn.commit()

Questo inserisce un nuovo libro nella nostra tabella. I marcatori ? sono segnaposto per i nostri dati, il che aiuta a prevenire attacchi di iniezione SQL (un argomento per un altro giorno!). Il metodo commit() salva le nostre modifiche.

Operazione READ

Recuperiamo alcune dati:

cursor.execute("SELECT * FROM books")
books = cursor.fetchall()
for book in books:
print(f"ID: {book[0]}, Titolo: {book[1]}, Autore: {book[2]}, Anno: {book[3]}")

Questo recupera tutti i libri e li stampa. È come chiedere al nostro bibliotecario di mostrarci tutti i libri che abbiamo.

Operazione UPDATE

Hai bisogno di correggere alcune informazioni? Nessun problema:

cursor.execute("UPDATE books SET year = ? WHERE title = ?", (1925, "The Great Gatsby"))
conn.commit()

Questo aggiorna l'anno di pubblicazione di "The Great Gatsby". Ricorda sempre di commitare le tue modifiche!

Operazione DELETE

A volte abbiamo bisogno di rimuovere delle voci:

cursor.execute("DELETE FROM books WHERE author = ?", ("J.K. Rowling",))
conn.commit()

Questo rimuove tutti i libri di J.K. Rowling dal nostro database. Attento alle operazioni DELETE - non c'è il pulsante annulla nei database!

Esecuzione di Transazioni

Le transazioni sono un modo per raggruppare operazioni insieme. Se una qualsiasi operazione fallisce, tutte sono annullate. È come un approccio "tutto o nulla":

try:
conn.execute("BEGIN TRANSACTION")
cursor.execute("INSERT INTO books (title, author, year) VALUES (?, ?, ?)",
("1984", "George Orwell", 1949))
cursor.execute("INSERT INTO books (title, author, year) VALUES (?, ?, ?)",
("Animal Farm", "George Orwell", 1945))
conn.commit()
print("Transazione riuscita!")
except sqlite3.Error as e:
conn.rollback()
print(f"Si è verificato un errore: {e}")

Operazione COMMIT

Abbiamo usato commit() in tutti i nostri esempi. È cruciale per salvare le nostre modifiche nel database. Senza di esso, le nostre modifiche sarebbero perse quando chiudiamo la connessione.

Operazione ROLLBACK

Se qualcosa va storto durante una transazione, possiamo usare rollback() per annullare tutte le modifiche fatte dal ultimo commit:

try:
# Alcune operazioni sul database
conn.commit()
except sqlite3.Error:
conn.rollback()

Il Modulo PyMySQL

Mentre SQLite è ottimo per imparare e per piccole applicazioni, molti progetti nel mondo reale utilizzano database più robusti come MySQL. Ecco un rapido sguardo su come usare PyMySQL:

import pymysql

conn = pymysql.connect(host='localhost',
user='your_username',
password='your_password',
database='your_database')

try:
with conn.cursor() as cursor:
sql = "INSERT INTO users (email, password) VALUES (%s, %s)"
cursor.execute(sql, ('[email protected]', 'very-secret'))
conn.commit()
finally:
conn.close()

I principi di base sono simili a SQLite, ma PyMySQL ci permette di connetterci a database MySQL remoti.

Gestione degli Errori

La gestione degli errori è cruciale quando si lavora con i database. Usa sempre blocchi try-except per catturare e gestire potenziali errori:

try:
# Operazioni sul database qui
except sqlite3.Error as e:
print(f"Si è verificato un errore: {e}")
finally:
conn.close()

Questo assicura che gestiamo gli errori in modo elegante e chiudiamo sempre la connessione al database, anche se si verifica un errore.

Ecco una tabella che riassume le principali operazioni sui database che abbiamo coperto:

Operazione Descrizione Esempio
Connect Stabilisce una connessione al database conn = sqlite3.connect("example.db")
Create Crea una nuova tabella o record cursor.execute("CREATE TABLE...")
Insert Aggiunge nuovi record a una tabella cursor.execute("INSERT INTO...")
Select Recupera dati dal database cursor.execute("SELECT...")
Update Modifica record esistenti cursor.execute("UPDATE...")
Delete Rimuove record da una tabella cursor.execute("DELETE FROM...")
Commit Salva le modifiche nel database conn.commit()
Rollback Annulla le modifiche dal ultimo commit conn.rollback()

Ed eccoci qui! Avete appena fatto i vostri primi passi nel mondo dell'accesso ai database con Python. Ricorda, la pratica rende perfetto, quindi non aver paura di sperimentare con questi concetti. Prima che te ne accorga, gestirai dati come un professionista! Buon coding, e che i tuoi database siano sempre ordinati e privi di errori!

Credits: Image by storyset