È un classico: hai un file CSV pieno di dati, un database SQLite pronto a riceverli, e poche righe di codice Python per fare da ponte. Sembra facile, ma un attimo dopo ti ritrovi a fissare un messaggio d’errore come “database is locked” o, peggio, un SELECT COUNT(*) che restituisce un desolante “0”.
L’importazione di dati può trasformarsi rapidamente in un campo minato.
Prima di mettere in discussione le tue capacità (o lanciare il monitor fuori dalla finestra), sappi che questi problemi sono frequentissimi e hanno una soluzione logica.
In questa guida, non ci limitiamo a darti uno script funzionante, ma analizziamo gli 8 intoppi più comuni che trasformano un’operazione da 5 minuti in un incubo di debug, e vediamo esattamente come risolverli.
L’esempio include:
✅ Creazione del database
✅ Creazione delle tabelle
✅ Lettura dei CSV (anche molto grandi)
✅ Inserimento efficiente dei record
✅ Esempio di utilizzo finale
import csv
import sqlite3
import random
from datetime import datetime, timedelta
# ======================================================
# 1) GENERAZIONE CSV CLIENTI
# ======================================================
clienti = [
[1, "Mario Rossi", "[email protected]"],
[2, "Luca Bianchi", "[email protected]"],
[3, "Giulia Verdi", "[email protected]"],
[4, "Sofia Neri", "[email protected]"],
[5, "Francesco Russo", "[email protected]"],
[6, "Antonio Greco", "[email protected]"],
[7, "Chiara Conti", "[email protected]"],
]
with open("clienti.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["cliente_id", "nome", "email"])
writer.writerows(clienti)
print("✅ CSV clienti generato")
# ======================================================
# 2) GENERAZIONE CSV ORDINI (tante righe)
# ======================================================
NUM_ORDINI = 200 # << cambia questo per generare più ordini
prodotti = [
("Notebook", 799.99),
("Mouse Wireless", 19.90),
("Monitor 27\"", 189.50),
("Tastiera Meccanica", 79.90),
("Webcam HD", 49.99),
("Stampante Laser", 119.90),
("SSD 1TB", 89.90),
]
def random_date():
start = datetime(2024, 1, 1)
end = datetime(2024, 12, 31)
delta = end - start
return (start + timedelta(days=random.randint(0, delta.days))).strftime("%Y-%m-%d")
with open("ordini_vendita.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["order_id", "data_ordine", "cliente_id", "prodotto", "quantita", "prezzo_unitario"])
for order_id in range(1, NUM_ORDINI + 1):
cliente_id = random.choice(clienti)[0]
prodotto, prezzo = random.choice(prodotti)
quantita = random.randint(1, 5)
writer.writerow([
order_id,
random_date(),
cliente_id,
prodotto,
quantita,
prezzo
])
print(f"✅ CSV ordini generato con {NUM_ORDINI} ordini")
# ======================================================
# 3) CREAZIONE DATABASE SQLITE
# ======================================================
conn = sqlite3.connect("vendite.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS clienti (
cliente_id INTEGER PRIMARY KEY,
nome TEXT,
email TEXT
)
""")
cursor.execute("""
CREATE TABLE IF NOT EXISTS ordini (
order_id INTEGER PRIMARY KEY,
data_ordine TEXT,
cliente_id INTEGER,
prodotto TEXT,
quantita INTEGER,
prezzo_unitario REAL,
FOREIGN KEY(cliente_id) REFERENCES clienti(cliente_id)
)
""")
print("✅ Tabelle SQLite create")
# ======================================================
# 4) IMPORT CSV CLIENTI
# ======================================================
with open("clienti.csv", "r", encoding="utf-8") as file:
lettore = csv.reader(file)
next(lettore) # salta header
cursor.executemany("""
INSERT INTO clienti (cliente_id, nome, email)
VALUES (?, ?, ?)
""", lettore)
print("✅ Clienti importati")
# ======================================================
# 5) IMPORT CSV ORDINI
# ======================================================
with open("ordini_vendita.csv", "r", encoding="utf-8") as file:
lettore = csv.reader(file)
next(lettore)
cursor.executemany("""
INSERT INTO ordini (order_id, data_ordine, cliente_id, prodotto, quantita, prezzo_unitario)
VALUES (?, ?, ?, ?, ?, ?)
""", lettore)
print("✅ Ordini importati")
conn.commit()
conn.close()
print("🎉 Importazione completata! Database: vendite.db")
✅ CSV clienti generato ✅ CSV ordini generato con 200 ordini ✅ Tabelle SQLite create ✅ Clienti importati ✅ Ordini importati 🎉 Importazione completata! Database: vendite.db
Cointrolliamo quante righe ha scritto nel db:
import sqlite3
conn = sqlite3.connect("vendite.db")
cursor = conn.cursor()
cursor.execute("SELECT COUNT(*) FROM ordini")
print("Ordini:", cursor.fetchone()[0])
conn.close()
Ordini: 200





