CLASSE QUINTA β€’ DATABASE MYSQL

Integrazione con Database MySQL

Collega le tue applicazioni AI a dati reali e persistenti

Immagina di avere un modello AI che prevede vendite future. Ma i dati dove li conservi? Come aggiorni il modello con nuovi dati? I database sono la memoria a lungo termine delle tue applicazioni AI!

πŸ—„οΈ PerchΓ© i Database sono Cruciali per l'AI?

🧠 Analogia: Il Cervello e la Memoria

Il tuo cervello (AI) ha bisogno di memoria (database) per:

β€’ Conservare esperienze: Dati storici per training

β€’ Aggiornare conoscenze: Nuovi dati per retraining

β€’ Consultare informazioni: Query per predizioni

β€’ Condividere sapere: PiΓΉ applicazioni usano stessi dati

β€’ Ricordare a lungo termine: Persistenza oltre la RAM

βœ… VANTAGGI DATABASE PER AI

  • Persistenza: Dati sopravvivono al riavvio
  • ScalabilitΓ : Milioni di record gestibili
  • Concorrenza: Multipli accessi simultanei
  • Sicurezza: Autenticazione e permessi
  • Backup: Copie di sicurezza automatiche
  • Query complesse: JOIN, aggregazioni, filtri

❌ SENZA DATABASE (solo file)

  • Perdita dati: Programma chiude β†’ dati persi
  • Lentezza: Lettura/scrittura file grandi
  • Concorrenza: File bloccati da un processo
  • Sicurezza: Nessun controllo accessi
  • IntegritΓ : Dati duplicati/inconsistenti
  • Query: Solo operazioni semplici

🎯 SCENARI REALI DOVE SERVE DATABASE:

E-commerce AI: Storico acquisti, preferenze, raccomandazioni

Sistema medico: Cartelle pazienti, diagnosi, trattamenti

Trading algoritmico: Prezzi storici, indicatori, trades

Social media: Post, like, amicizie, raccomandazioni

IoT: Dati sensori, alert, manutenzione predittiva

Chatbot: Conversazioni, contesto, apprendimento

🐬 MySQL: Il Database Relazionale più Popolare

πŸ“Š Cosa significa "Database Relazionale"?

Pensa a un foglio Excel con superpoteri:

β€’ Tabelle: Fogli Excel separati

β€’ Colonne: Intestazioni colonne (nome, tipo, vincoli)

β€’ Righe: Record (una riga = un'entitΓ )

β€’ Relazioni: Collegamenti tra tabelle (chivi esterne)

β€’ Query: Formula avanzate per estrarre dati

πŸ“‹ Tabella: clienti
Colonna
Tipo
Chiave
id
INT AUTO_INCREMENT
PRIMARY
nome
VARCHAR(100)
email
VARCHAR(255)
UNIQUE
data_registrazione
DATE
credito
DECIMAL(10,2)
πŸ›’ Tabella: ordini
Colonna
Tipo
Chiave
id
INT AUTO_INCREMENT
PRIMARY
cliente_id
INT
FOREIGN
data_ordine
DATETIME
totale
DECIMAL(10,2)
stato
ENUM('pending','shipped','delivered')
🚫 COPIA BLOCCATA
# INSTALLAZIONE E CONNESSIONE A MYSQL CON PYTHON print("🎯 CONNESSIONE A MYSQL DA PYTHON") print("=" * 70) # PREREQUISITI: # 1. MySQL Server installato e running # 2. Python package: mysql-connector-python # Installa con: pip install mysql-connector-python import mysql.connector from mysql.connector import Error import pandas as pd import numpy as np from datetime import datetime, date import warnings warnings.filterwarnings('ignore') print("πŸ“¦ PACCHETTI IMPORTATI CORRETTAMENTE") def create_connection(host_name, user_name, user_password, db_name=None): """ Crea una connessione al database MySQL Args: host_name: Host del database (es: 'localhost') user_name: Username MySQL user_password: Password MySQL db_name: Nome database (opzionale) Returns: connection: Oggetto connessione MySQL """ connection = None try: connection = mysql.connector.connect( host=host_name, user=user_name, passwd=user_password, database=db_name ) print(f"βœ… Connessione a MySQL riuscita{' a database ' + db_name if db_name else ''}") except Error as e: print(f"❌ Errore di connessione: '{e}'") print("\nπŸ’‘ RISOLUZIONE PROBLEMI:") print("1. Verifica che MySQL sia in esecuzione") print("2. Controlla username/password") print("3. Assicurati di avere i permessi") print("4. Prova con host '127.0.0.1' invece di 'localhost'") return connection # CONNESSIONE DI ESEMPIO (sostituisci con i tuoi dati) print("\nπŸ”Œ PROVA DI CONNESSIONE:") print("-" * 40) # Modifica questi valori con i tuoi! connection_config = { 'host_name': 'localhost', 'user_name': 'root', # Cambia con il tuo username 'user_password': 'password', # Cambia con la tua password 'db_name': None # Prima ci connettiamo senza database } # Prova connessione (commenta se non hai MySQL installato) try: connection = create_connection(**connection_config) if connection and connection.is_connected(): db_info = connection.get_server_info() print(f"πŸ“Š Informazioni server MySQL: {db_info}") # Mostra database esistenti cursor = connection.cursor() cursor.execute("SHOW DATABASES") databases = cursor.fetchall() print(f"\nπŸ—ƒοΈ Database disponibili ({len(databases)}):") for db in databases: print(f" β€’ {db[0]}") cursor.close() connection.close() print("\nπŸ”Œ Connessione chiusa correttamente") except Exception as e: print(f"⚠️ Nota: {e}") print("Continueremo con esempi dimostrativi...") # CREAZIONE DI UN DATABASE COMPLETO PER AI print("\n\nπŸ—οΈ CREAZIONE DATABASE PER APPLICAZIONE AI") print("=" * 70) def create_ai_database(): """ Crea un database di esempio per applicazioni AI """ print("πŸ“‹ Creazione database 'ai_enterprise'...") # Script SQL per creare il database sql_script = """ -- ============================================ -- DATABASE: ai_enterprise -- Per applicazioni AI enterprise -- ============================================ -- Creazione database CREATE DATABASE IF NOT EXISTS ai_enterprise; USE ai_enterprise; -- ============================================ -- TABELLA: clienti -- Memorizza informazioni clienti per marketing AI -- ============================================ CREATE TABLE IF NOT EXISTS clienti ( id INT AUTO_INCREMENT PRIMARY KEY, codice_cliente VARCHAR(20) UNIQUE NOT NULL, nome VARCHAR(100) NOT NULL, cognome VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, telefono VARCHAR(20), data_nascita DATE, citta VARCHAR(100), paese VARCHAR(100), data_registrazione DATETIME DEFAULT CURRENT_TIMESTAMP, segmento ENUM('basic', 'premium', 'vip') DEFAULT 'basic', punteggio_fidelita INT DEFAULT 0, data_ultimo_acquisto DATE, totale_acquisti DECIMAL(12,2) DEFAULT 0.00, frequenza_acquisti INT DEFAULT 0, cluster_ai INT, -- Per clustering AI propensione_acquisto DECIMAL(5,4), -- Per modelli predittivi INDEX idx_email (email), INDEX idx_citta (citta), INDEX idx_segmento (segmento), INDEX idx_cluster_ai (cluster_ai) ); -- ============================================ -- TABELLA: prodotti -- Catalogo prodotti per raccomandazioni AI -- ============================================ CREATE TABLE IF NOT EXISTS prodotti ( id INT AUTO_INCREMENT PRIMARY KEY, sku VARCHAR(50) UNIQUE NOT NULL, nome VARCHAR(200) NOT NULL, descrizione TEXT, categoria VARCHAR(100), sottocategoria VARCHAR(100), prezzo DECIMAL(10,2) NOT NULL, costo DECIMAL(10,2), quantita_magazzino INT DEFAULT 0, valutazione_media DECIMAL(3,2) DEFAULT 0.00, numero_recensioni INT DEFAULT 0, tags JSON, -- Per ricerca semantica features_embedding JSON, -- Per similarity AI data_inserimento DATETIME DEFAULT CURRENT_TIMESTAMP, attivo BOOLEAN DEFAULT TRUE, INDEX idx_categoria (categoria), INDEX idx_prezzo (prezzo), INDEX idx_valutazione (valutazione_media), FULLTEXT idx_ricerca (nome, descrizione, tags) -- Per ricerca full-text ); -- ============================================ -- TABELLA: transazioni -- Storico transazioni per modelli predittivi -- ============================================ CREATE TABLE IF NOT EXISTS transazioni ( id INT AUTO_INCREMENT PRIMARY KEY, id_cliente INT NOT NULL, id_prodotto INT NOT NULL, data_transazione DATETIME DEFAULT CURRENT_TIMESTAMP, quantita INT NOT NULL, prezzo_unitario DECIMAL(10,2) NOT NULL, totale DECIMAL(12,2) NOT NULL, sconto DECIMAL(5,2) DEFAULT 0.00, metodo_pagamento ENUM('carta', 'paypal', 'contanti', 'bonifico'), canale ENUM('web', 'mobile', 'negozio', 'telefono'), stato ENUM('completata', 'fallita', 'rimborsata', 'in_attesa'), rating_transazione INT CHECK (rating_transazione >= 1 AND rating_transazione <= 5), features_transazione JSON, -- Features per modelli AI FOREIGN KEY (id_cliente) REFERENCES clienti(id) ON DELETE CASCADE, FOREIGN KEY (id_prodotto) REFERENCES prodotti(id) ON DELETE RESTRICT, INDEX idx_data_transazione (data_transazione), INDEX idx_cliente_transazione (id_cliente, data_transazione), INDEX idx_prodotto_transazione (id_prodotto), INDEX idx_stato (stato) ); -- ============================================ -- TABELLA: interazioni -- Dati comportamentali per modelli di engagement -- ============================================ CREATE TABLE IF NOT EXISTS interazioni ( id INT AUTO_INCREMENT PRIMARY KEY, id_cliente INT NOT NULL, tipo_interazione ENUM('pagina_visita', 'prodotto_visto', 'carrello_aggiunto', 'wishlist_aggiunto', 'ricerca', 'click_banner', 'email_aperta'), id_prodotto INT, url VARCHAR(500), tempo_sessione INT, -- In secondi data_interazione DATETIME DEFAULT CURRENT_TIMESTAMP, dispositivo ENUM('desktop', 'mobile', 'tablet'), browser VARCHAR(100), ip_address VARCHAR(45), metadati JSON, FOREIGN KEY (id_cliente) REFERENCES clienti(id) ON DELETE CASCADE, FOREIGN KEY (id_prodotto) REFERENCES prodotti(id) ON DELETE SET NULL, INDEX idx_tipo_interazione (tipo_interazione), INDEX idx_data_interazione (data_interazione), INDEX idx_cliente_interazione (id_cliente, data_interazione) ); -- ============================================ -- TABELLA: modelli_ai -- Registro modelli AI addestrati -- ============================================ CREATE TABLE IF NOT EXISTS modelli_ai ( id INT AUTO_INCREMENT PRIMARY KEY, nome_modello VARCHAR(100) NOT NULL, tipo_modello ENUM('classificazione', 'regressione', 'clustering', 'raccomandazione'), algoritmo VARCHAR(100), versione VARCHAR(20), percorso_file VARCHAR(500), accuracy DECIMAL(5,4), precision DECIMAL(5,4), recall DECIMAL(5,4), f1_score DECIMAL(5,4), mse DECIMAL(10,4), data_addestramento DATETIME DEFAULT CURRENT_TIMESTAMP, dati_addestramento_inizio DATE, dati_addestramento_fine DATE, hyperparametri JSON, features_usate JSON, stato ENUM('attivo', 'deprecato', 'testing'), note TEXT, INDEX idx_tipo_modello (tipo_modello), INDEX idx_data_addestramento (data_addestramento), INDEX idx_stato_modello (stato) ); -- ============================================ -- TABELLA: predizioni -- Storage predizioni dei modelli AI -- ============================================ CREATE TABLE IF NOT EXISTS predizioni ( id INT AUTO_INCREMENT PRIMARY KEY, id_modello INT NOT NULL, id_cliente INT, id_prodotto INT, data_predizione DATETIME DEFAULT CURRENT_TIMESTAMP, tipo_predizione ENUM('propensione_acquisto', 'churn', 'lifetime_value', 'raccomandazione', 'segmentazione'), valore_predizione DECIMAL(10,4), probabilita DECIMAL(5,4), classe_predetta VARCHAR(100), threshold_usato DECIMAL(5,4), features_input JSON, spiegazione_predizione JSON, -- Per AI explainable valutazione_reale BOOLEAN, -- Se disponibile feedback reale data_valutazione DATE, FOREIGN KEY (id_modello) REFERENCES modelli_ai(id) ON DELETE CASCADE, FOREIGN KEY (id_cliente) REFERENCES clienti(id) ON DELETE CASCADE, FOREIGN KEY (id_prodotto) REFERENCES prodotti(id) ON DELETE CASCADE, INDEX idx_data_predizione (data_predizione), INDEX idx_tipo_predizione (tipo_predizione), INDEX idx_modello_predizione (id_modello, data_predizione), INDEX idx_cliente_predizione (id_cliente, tipo_predizione) ); -- ============================================ -- VISTE UTILI PER ANALISI -- ============================================ -- Vista: Clienti con propensione acquisto alta CREATE OR REPLACE VIEW vw_clienti_propensi AS SELECT c.id, c.nome, c.cognome, c.email, c.segmento, c.totale_acquisti, c.frequenza_acquisti, p.valore_predizione as propensione_acquisto, p.data_predizione FROM clienti c JOIN predizioni p ON c.id = p.id_cliente WHERE p.tipo_predizione = 'propensione_acquisto' AND p.valore_predizione > 0.7 AND p.data_predizione >= DATE_SUB(NOW(), INTERVAL 30 DAY) ORDER BY p.valore_predizione DESC; -- Vista: Prodotti raccomandati per cliente CREATE OR REPLACE VIEW vw_raccomandazioni AS SELECT c.id as cliente_id, c.nome, c.cognome, pr.id as prodotto_id, pr.nome as prodotto_nome, pr.prezzo, p.valore_predizione as score_raccomandazione, p.probabilita, p.data_predizione FROM clienti c JOIN predizioni p ON c.id = p.id_cliente JOIN prodotti pr ON p.id_prodotto = pr.id WHERE p.tipo_predizione = 'raccomandazione' AND p.valore_predizione > 0.5 AND pr.attivo = TRUE ORDER BY c.id, p.valore_predizione DESC; -- Vista: Performance modelli AI CREATE OR REPLACE VIEW vw_performance_modelli AS SELECT m.nome_modello, m.tipo_modello, m.algoritmo, m.versione, m.accuracy, m.precision, m.recall, m.f1_score, m.data_addestramento, COUNT(p.id) as numero_predizioni, AVG(CASE WHEN p.valutazione_reale = TRUE THEN 1 ELSE 0 END) * 100 as percentuale_corrette FROM modelli_ai m LEFT JOIN predizioni p ON m.id = p.id_modello WHERE m.stato = 'attivo' GROUP BY m.id ORDER BY m.data_addestramento DESC; -- ============================================ -- PROCEDURE E FUNZIONI -- ============================================ -- Funzione: Calcola Lifetime Value di un cliente DELIMITER $$ CREATE FUNCTION fn_calcola_ltv( p_cliente_id INT, p_mesi INT DEFAULT 12 ) RETURNS DECIMAL(12,2) DETERMINISTIC READS SQL DATA BEGIN DECLARE totale_ltv DECIMAL(12,2); SELECT COALESCE(SUM(totale), 0) INTO totale_ltv FROM transazioni WHERE id_cliente = p_cliente_id AND data_transazione >= DATE_SUB(NOW(), INTERVAL p_mesi MONTH) AND stato = 'completata'; RETURN totale_ltv; END$$ DELIMITER ; -- Procedura: Aggiorna cluster AI per tutti i clienti DELIMITER $$ CREATE PROCEDURE sp_aggiorna_cluster_clienti() BEGIN -- Qui andrebbe la logica di clustering AI -- Per ora Γ¨ un placeholder UPDATE clienti SET cluster_ai = FLOOR(RAND() * 5) + 1 WHERE cluster_ai IS NULL; END$$ DELIMITER ; -- Trigger: Aggiorna statistiche cliente dopo transazione DELIMITER $$ CREATE TRIGGER tr_aggiorna_statistiche_cliente AFTER INSERT ON transazioni FOR EACH ROW BEGIN UPDATE clienti SET totale_acquisti = totale_acquisti + NEW.totale, frequenza_acquisti = frequenza_acquisti + 1, data_ultimo_acquisto = DATE(NEW.data_transazione) WHERE id = NEW.id_cliente; END$$ DELIMITER ; -- ============================================ -- INSERIMENTO DATI DI ESEMPIO -- ============================================ -- Inserimento clienti di esempio INSERT INTO clienti (codice_cliente, nome, cognome, email, citta, segmento, data_registrazione) VALUES ('CLI001', 'Mario', 'Rossi', 'mario.rossi@email.com', 'Roma', 'premium', '2023-01-15'), ('CLI002', 'Laura', 'Bianchi', 'laura.bianchi@email.com', 'Milano', 'vip', '2023-02-20'), ('CLI003', 'Giuseppe', 'Verdi', 'giuseppe.verdi@email.com', 'Napoli', 'basic', '2023-03-10'), ('CLI004', 'Anna', 'Neri', 'anna.neri@email.com', 'Torino', 'premium', '2023-04-05'), ('CLI005', 'Luca', 'Gialli', 'luca.gialli@email.com', 'Bologna', 'basic', '2023-05-12'); -- Inserimento prodotti di esempio INSERT INTO prodotti (sku, nome, categoria, prezzo, quantita_magazzino) VALUES ('SKU001', 'Smartphone Premium', 'Elettronica', 899.99, 50), ('SKU002', 'Laptop Gaming', 'Elettronica', 1299.99, 30), ('SKU003', 'Cuffie Wireless', 'Audio', 199.99, 100), ('SKU004', 'Smartwatch', 'Elettronica', 299.99, 75), ('SKU005', 'Tablet 10"', 'Elettronica', 499.99, 40), ('SKU006', 'T-shirt Basic', 'Abbigliamento', 19.99, 200), ('SKU007', 'Jeans Slim', 'Abbigliamento', 59.99, 150), ('SKU008', 'Scarpe Running', 'Sport', 89.99, 80); -- Inserimento transazioni di esempio INSERT INTO transazioni (id_cliente, id_prodotto, quantita, prezzo_unitario, totale, metodo_pagamento, canale, stato) VALUES (1, 1, 1, 899.99, 899.99, 'carta', 'web', 'completata'), (2, 2, 1, 1299.99, 1299.99, 'paypal', 'web', 'completata'), (3, 3, 2, 199.99, 399.98, 'carta', 'mobile', 'completata'), (1, 4, 1, 299.99, 299.99, 'carta', 'web', 'completata'), (4, 5, 1, 499.99, 499.99, 'bonifico', 'web', 'completata'); -- Inserimento modelli AI di esempio INSERT INTO modelli_ai (nome_modello, tipo_modello, algoritmo, versione, accuracy, precision, recall, f1_score, stato) VALUES ('Propensione Acquisto v1', 'regressione', 'Random Forest', '1.0', 0.85, 0.82, 0.87, 0.84, 'attivo'), ('Raccomandazione Prodotti v2', 'raccomandazione', 'Collaborative Filtering', '2.1', 0.78, 0.75, 0.80, 0.77, 'attivo'), ('Segmentazione Clienti v1', 'clustering', 'K-Means', '1.0', 0.91, NULL, NULL, NULL, 'attivo'); -- Inserimento predizioni di esempio INSERT INTO predizioni (id_modello, id_cliente, id_prodotto, tipo_predizione, valore_predizione, probabilita, classe_predetta) VALUES (1, 1, NULL, 'propensione_acquisto', 0.87, 0.85, 'alto'), (1, 2, NULL, 'propensione_acquisto', 0.92, 0.90, 'molto_alto'), (2, 1, 2, 'raccomandazione', 0.78, 0.75, 'raccomandato'), (2, 1, 3, 'raccomandazione', 0.65, 0.62, 'raccomandato'), (3, 1, NULL, 'segmentazione', NULL, NULL, 'cluster_3'); print("βœ… Database 'ai_enterprise' creato con successo!") print("β€’ 5 tabelle principali") print("β€’ 3 viste analitiche") print("β€’ 1 funzione, 1 procedura, 1 trigger") print("β€’ Dati di esempio inseriti") """ print("πŸ“ Script SQL generato. Copialo ed eseguilo in MySQL Workbench o phpMyAdmin.") return sql_script # Genera lo script database_script = create_ai_database() print("\nπŸ’‘ COME USARE QUESTO SCRIPT:") print("1. Apri MySQL Workbench o phpMyAdmin") print("2. Incolla tutto lo script SQL") print("3. Esegui lo script") print("4. Il database 'ai_enterprise' sarΓ  creato con dati di esempio") print("\n🎯 STRUTTURA CREATA:") print("β€’ clienti: Dati clienti per personalizzazione") print("β€’ prodotti: Catalogo per raccomandazioni") print("β€’ transazioni: Storico per modelli predittivi") print("β€’ interazioni: Dati comportamentali per engagement") print("β€’ modelli_ai: Catalogo modelli addestrati") print("β€’ predizioni: Storage risultati AI") # ALTERNATIVA: CREAZIONE CON PYTHON (se connesso) print("\n\nπŸ”§ CREAZIONE DATABASE CON PYTHON (se connesso)") print("=" * 70) def create_database_with_python(): """Crea database usando Python (richiede connessione attiva)""" try: # Riconnettiti (questa volta specificando il database) config_with_db = connection_config.copy() config_with_db['db_name'] = 'ai_enterprise_test' connection = create_connection(**config_with_db) if connection and connection.is_connected(): cursor = connection.cursor() # Crea database cursor.execute("CREATE DATABASE IF NOT EXISTS ai_enterprise_test") print("βœ… Database 'ai_enterprise_test' creato") # Usa il database cursor.execute("USE ai_enterprise_test") # Crea tabella clienti semplificata create_table_sql = """ CREATE TABLE IF NOT EXISTS clienti_test ( id INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(100), email VARCHAR(255) UNIQUE, eta INT, citta VARCHAR(100), punteggio_fidelita INT DEFAULT 0, data_creazione TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) """ cursor.execute(create_table_sql) print("βœ… Tabella 'clienti_test' creata") # Inserisci dati di esempio insert_data_sql = """ INSERT INTO clienti_test (nome, email, eta, citta, punteggio_fidelita) VALUES (%s, %s, %s, %s, %s) """ clienti_di_esempio = [ ('Mario Rossi', 'mario@email.com', 35, 'Roma', 150), ('Laura Bianchi', 'laura@email.com', 28, 'Milano', 200), ('Giuseppe Verdi', 'giuseppe@email.com', 42, 'Napoli', 75), ('Anna Neri', 'anna@email.com', 31, 'Torino', 300), ('Luca Gialli', 'luca@email.com', 25, 'Bologna', 50) ] cursor.executemany(insert_data_sql, clienti_di_esempio) connection.commit() print(f"βœ… {cursor.rowcount} clienti inseriti") # Leggi i dati inseriti cursor.execute("SELECT * FROM clienti_test") clienti = cursor.fetchall() print(f"\nπŸ“Š CLIENTI INSERITI ({len(clienti)}):") print("-" * 80) for cliente in clienti: print(f"ID: {cliente[0]}, Nome: {cliente[1]}, Email: {cliente[2]}, " f"EtΓ : {cliente[3]}, CittΓ : {cliente[4]}, Punteggio: {cliente[5]}") # Operazione UPDATE update_sql = "UPDATE clienti_test SET punteggio_fidelita = punteggio_fidelita + 10 WHERE citta = 'Milano'" cursor.execute(update_sql) connection.commit() print(f"\nβœ… Aggiornati {cursor.rowcount} clienti milanesi (+10 punti)") # Operazione DELETE delete_sql = "DELETE FROM clienti_test WHERE punteggio_fidelita < 100" cursor.execute(delete_sql) connection.commit() print(f"βœ… Eliminati {cursor.rowcount} clienti con punteggio < 100") # Query complessa con JOIN (se avessimo altre tabelle) print("\nπŸ“ˆ QUERY COMPLESSE DISPONIBILI:") print("1. JOIN tra tabelle: clienti + transazioni") print("2. GROUP BY per aggregazioni") print("3. HAVING per filtrare gruppi") print("4. SUBQUERY per query annidate") print("5. WINDOW FUNCTIONS per analisi avanzate") cursor.close() connection.close() print("\nπŸ”Œ Connessione chiusa") except Error as e: print(f"❌ Errore durante operazioni database: {e}") # Esegui la creazione (scommenta se hai MySQL connesso) # create_database_with_python()

πŸ”§ Operazioni CRUD con Python

CRUD = Create, Read, Update, Delete - le 4 operazioni fondamentali sui dati.

πŸ“

CREATE

Inserire nuovi dati

INSERT INTO table VALUES (...)

πŸ”

READ

Leggere dati esistenti

SELECT * FROM table WHERE...

πŸ”„

UPDATE

Aggiornare dati esistenti

UPDATE table SET ... WHERE...

πŸ—‘οΈ

DELETE

Eliminare dati

DELETE FROM table WHERE...

🚫 COPIA BLOCCATA
# OPERAZIONI CRUD COMPLETE CON PYTHON print("🎯 OPERAZIONI CRUD CON MYSQL CONNECTOR") print("=" * 70) class MySQLAIDatabase: """Classe per gestire operazioni database per applicazioni AI""" def __init__(self, host='localhost', user='root', password='', database='ai_enterprise'): self.host = host self.user = user self.password = password self.database = database self.connection = None self.cursor = None def connect(self): """Stabilisce connessione al database""" try: self.connection = mysql.connector.connect( host=self.host, user=self.user, password=self.password, database=self.database ) self.cursor = self.connection.cursor(dictionary=True) # Ritorna dizionari print(f"βœ… Connesso a database: {self.database}") return True except Error as e: print(f"❌ Errore connessione: {e}") return False def disconnect(self): """Chiude connessione""" if self.connection and self.connection.is_connected(): self.cursor.close() self.connection.close() print("πŸ”Œ Connessione chiusa") # ========== OPERAZIONI CRUD ========== def create_cliente(self, cliente_data): """ CREATE: Inserisce un nuovo cliente Args: cliente_data: Dizionario con dati cliente """ sql = """ INSERT INTO clienti (codice_cliente, nome, cognome, email, telefono, data_nascita, citta, paese, segmento) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) """ values = ( cliente_data.get('codice_cliente'), cliente_data.get('nome'), cliente_data.get('cognome'), cliente_data.get('email'), cliente_data.get('telefono'), cliente_data.get('data_nascita'), cliente_data.get('citta'), cliente_data.get('paese'), cliente_data.get('segmento', 'basic') ) try: self.cursor.execute(sql, values) self.connection.commit() cliente_id = self.cursor.lastrowid print(f"βœ… Cliente creato con ID: {cliente_id}") return cliente_id except Error as e: print(f"❌ Errore creazione cliente: {e}") return None def read_clienti(self, filters=None, limit=100): """ READ: Legge clienti con filtri Args: filters: Dizionario con filtri (es: {'citta': 'Roma', 'segmento': 'premium'}) limit: Limite risultati Returns: Lista di clienti """ sql = "SELECT * FROM clienti WHERE 1=1" values = [] if filters: for key, value in filters.items(): sql += f" AND {key} = %s" values.append(value) sql += f" LIMIT {limit}" try: self.cursor.execute(sql, values) clienti = self.cursor.fetchall() print(f"βœ… Trovati {len(clienti)} clienti") return clienti except Error as e: print(f"❌ Errore lettura clienti: {e}") return [] def update_cliente(self, cliente_id, update_data): """ UPDATE: Aggiorna dati cliente Args: cliente_id: ID cliente da aggiornare update_data: Dizionario con campi da aggiornare """ if not update_data: print("⚠️ Nessun dato da aggiornare") return False set_clause = ", ".join([f"{key} = %s" for key in update_data.keys()]) sql = f"UPDATE clienti SET {set_clause} WHERE id = %s" values = list(update_data.values()) values.append(cliente_id) try: self.cursor.execute(sql, values) self.connection.commit() if self.cursor.rowcount > 0: print(f"βœ… Cliente {cliente_id} aggiornato. Righe modificate: {self.cursor.rowcount}") return True else: print(f"⚠️ Nessun cliente trovato con ID: {cliente_id}") return False except Error as e: print(f"❌ Errore aggiornamento cliente: {e}") return False def delete_cliente(self, cliente_id): """ DELETE: Elimina cliente (con transazioni correlate per CASCADE) Args: cliente_id: ID cliente da eliminare """ sql = "DELETE FROM clienti WHERE id = %s" try: self.cursor.execute(sql, (cliente_id,)) self.connection.commit() if self.cursor.rowcount > 0: print(f"βœ… Cliente {cliente_id} eliminato. Righe eliminate: {self.cursor.rowcount}") return True else: print(f"⚠️ Nessun cliente trovato con ID: {cliente_id}") return False except Error as e: print(f"❌ Errore eliminazione cliente: {e}") return False # ========== OPERAZIONI AI-SPECIFICHE ========== def get_data_for_training(self, table_name, features, target=None, limit=10000): """ Estrae dati per training modelli AI Args: table_name: Nome tabella features: Lista di colonne features target: Colonna target (opzionale) limit: Limite record Returns: DataFrame pandas con dati """ import pandas as pd if target: columns = features + [target] else: columns = features columns_str = ", ".join(columns) sql = f"SELECT {columns_str} FROM {table_name} LIMIT {limit}" try: self.cursor.execute(sql) data = self.cursor.fetchall() df = pd.DataFrame(data) print(f"βœ… Estratti {len(df)} record per training") return df except Error as e: print(f"❌ Errore estrazione dati training: {e}") return pd.DataFrame() def save_prediction(self, prediction_data): """ Salva predizione di un modello AI Args: prediction_data: Dizionario con dati predizione """ sql = """ INSERT INTO predizioni (id_modello, id_cliente, id_prodotto, tipo_predizione, valore_predizione, probabilita, classe_predetta, features_input) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) """ values = ( prediction_data.get('id_modello'), prediction_data.get('id_cliente'), prediction_data.get('id_prodotto'), prediction_data.get('tipo_predizione'), prediction_data.get('valore_predizione'), prediction_data.get('probabilita'), prediction_data.get('classe_predetta'), str(prediction_data.get('features_input', {})) # JSON come stringa ) try: self.cursor.execute(sql, values) self.connection.commit() prediction_id = self.cursor.lastrowid print(f"βœ… Predizione salvata con ID: {prediction_id}") return prediction_id except Error as e: print(f"❌ Errore salvataggio predizione: {e}") return None def get_recommendations(self, cliente_id, limit=5): """ Ottiene raccomandazioni per un cliente Args: cliente_id: ID cliente limit: Numero raccomandazioni Returns: Lista di prodotti raccomandati """ sql = """ SELECT p.id, p.sku, p.nome, p.categoria, p.prezzo, pr.valore_predizione as score, pr.probabilita, pr.data_predizione FROM predizioni pr JOIN prodotti p ON pr.id_prodotto = p.id WHERE pr.id_cliente = %s AND pr.tipo_predizione = 'raccomandazione' AND p.attivo = TRUE ORDER BY pr.valore_predizione DESC LIMIT %s """ try: self.cursor.execute(sql, (cliente_id, limit)) recommendations = self.cursor.fetchall() print(f"βœ… Trovate {len(recommendations)} raccomandazioni per cliente {cliente_id}") return recommendations except Error as e: print(f"❌ Errore ottenimento raccomandazioni: {e}") return [] # ========== ANALYTICS E REPORTING ========== def get_customer_analytics(self, start_date=None, end_date=None): """ Analytics avanzate sui clienti Returns: Statistiche e metriche clienti """ analytics = {} # Totale clienti self.cursor.execute("SELECT COUNT(*) as total FROM clienti") analytics['total_clienti'] = self.cursor.fetchone()['total'] # Clienti per segmento self.cursor.execute(""" SELECT segmento, COUNT(*) as count FROM clienti GROUP BY segmento ORDER BY count DESC """) analytics['clienti_per_segmento'] = self.cursor.fetchall() # Clienti per cittΓ  (top 10) self.cursor.execute(""" SELECT citta, COUNT(*) as count FROM clienti WHERE citta IS NOT NULL GROUP BY citta ORDER BY count DESC LIMIT 10 """) analytics['top_citta'] = self.cursor.fetchall() # Clienti con propensione acquisto alta self.cursor.execute(""" SELECT COUNT(DISTINCT id_cliente) as count FROM predizioni WHERE tipo_predizione = 'propensione_acquisto' AND valore_predizione > 0.7 AND data_predizione >= DATE_SUB(NOW(), INTERVAL 30 DAY) """) analytics['clienti_propensi'] = self.cursor.fetchone()['count'] # Valore medio transazione per segmento self.cursor.execute(""" SELECT c.segmento, COUNT(t.id) as numero_transazioni, AVG(t.totale) as valore_medio, SUM(t.totale) as valore_totale FROM clienti c LEFT JOIN transazioni t ON c.id = t.id_cliente WHERE t.stato = 'completata' GROUP BY c.segmento ORDER BY valore_totale DESC """) analytics['valore_per_segmento'] = self.cursor.fetchall() return analytics def export_to_dataframe(self, query): """ Esegue query e restituisce DataFrame pandas Args: query: Query SQL Returns: DataFrame con risultati """ import pandas as pd try: self.cursor.execute(query) data = self.cursor.fetchall() df = pd.DataFrame(data) print(f"βœ… Esportati {len(df)} record in DataFrame") return df except Error as e: print(f"❌ Errore esportazione DataFrame: {e}") return pd.DataFrame() # DEMOSTRAZIONE PRATICA print("\nπŸš€ DEMOSTRAZIONE OPERAZIONI DATABASE PER AI") print("=" * 70) # Crea istanza database (usa i tuoi dati di connessione) db = MySQLAIDatabase( host='localhost', user='root', # Cambia con il tuo username password='password', # Cambia con la tua password database='ai_enterprise_test' # O il tuo database ) # Connetti if db.connect(): print("\nπŸ“Š OPERAZIONI CRUD DEMO:") print("-" * 40) # 1. CREATE - Crea nuovo cliente print("\n1️⃣ CREATE - Nuovo cliente:") nuovo_cliente = { 'codice_cliente': 'CLI006', 'nome': 'Francesca', 'cognome': 'Blu', 'email': 'francesca.blu@email.com', 'telefono': '3331234567', 'data_nascita': '1990-08-15', 'citta': 'Firenze', 'paese': 'Italia', 'segmento': 'premium' } cliente_id = db.create_cliente(nuovo_cliente) # 2. READ - Leggi clienti di Firenze print("\n2️⃣ READ - Clienti di Firenze:") clienti_firenze = db.read_clienti({'citta': 'Firenze'}) for cliente in clienti_firenze: print(f" β€’ {cliente['nome']} {cliente['cognome']} - {cliente['email']}") # 3. UPDATE - Aggiorna punteggio fedeltΓ  print("\n3️⃣ UPDATE - Aggiorna punteggio fedeltΓ :") if cliente_id: update_success = db.update_cliente(cliente_id, { 'punteggio_fidelita': 100, 'segmento': 'vip' # Promosso a VIP }) # 4. DELETE - Elimina cliente (commentato per sicurezza) print("\n4️⃣ DELETE - Elimina cliente (SIMULATO):") # db.delete_cliente(cliente_id) # Scommenta per testare # OPERAZIONI AI print("\nπŸ€– OPERAZIONI AI-SPECIFICHE:") print("-" * 40) # Estrai dati per training print("\nπŸ“₯ Estrazione dati per training modello:") training_data = db.get_data_for_training( table_name='clienti_test', features=['eta', 'punteggio_fidelita'], target=None, limit=100 ) if not training_data.empty: print(f" β€’ Shape dati: {training_data.shape}") print(f" β€’ Colonne: {list(training_data.columns)}") print(f" β€’ Primi 3 record:") print(training_data.head(3)) # Salva predizione (simulata) print("\nπŸ’Ύ Salvataggio predizione AI:") predizione_simulata = { 'id_modello': 1, 'id_cliente': cliente_id, 'id_prodotto': 3, 'tipo_predizione': 'raccomandazione', 'valore_predizione': 0.82, 'probabilita': 0.78, 'classe_predetta': 'raccomandato', 'features_input': {'eta': 33, 'punteggio': 100, 'storico_acquisti': 5} } prediction_id = db.save_prediction(predizione_simulata) # Analytics print("\nπŸ“ˆ Analytics clienti:") analytics = db.get_customer_analytics() print(f" β€’ Totale clienti: {analytics.get('total_clienti', 'N/A')}") print(f" β€’ Clienti propensi acquisto: {analytics.get('clienti_propensi', 'N/A')}") # Esporta in DataFrame per analisi Python print("\nπŸ“€ Esportazione in DataFrame pandas:") query = "SELECT * FROM clienti_test WHERE punteggio_fidelita > 50" df = db.export_to_dataframe(query) if not df.empty: print(f" β€’ DataFrame shape: {df.shape}") print(f" β€’ Colonne: {list(df.columns)}") # Puoi ora usare pandas per analisi # Esempio: df.describe(), df.groupby(), etc. # Disconnetti db.disconnect() print("\nπŸ’‘ FLUSSO COMPLETO AI + DATABASE:") print("1. Database β†’ Estrai dati storici") print("2. Python β†’ Addestra modello AI") print("3. Database β†’ Salva modello addestrato") print("4. Real-time β†’ Database fornisce features al modello") print("5. AI β†’ Produce predizioni") print("6. Database β†’ Salva predizioni per monitoraggio") print("7. Feedback β†’ Database aggiornato con risultati reali") print("8. Retraining β†’ Nuovo ciclo con dati aggiornati") print("\nβœ… DEMOSTRAZIONE COMPLETATA!") print("Hai visto l'intero ciclo di integrazione AI + Database!")

πŸ›‘οΈ Sicurezza e Best Practices

⚠️ ATTENZIONE: SQL INJECTION

Il problema di sicurezza #1 per applicazioni database!

🚫 COPIA BLOCCATA
# SQL INJECTION - COME PROTEGGERSI print("πŸ›‘οΈ SQL INJECTION: IL PERICOLO E LE SOLUZIONI") print("=" * 70) # ❌ CODICE VULNERABILE (MAI FARE COSÌ!) def get_user_vulnerabile(username): """Funzione VULNERABILE a SQL injection""" query = f"SELECT * FROM users WHERE username = '{username}'" # Se username = "admin' OR '1'='1" # La query diventa: SELECT * FROM users WHERE username = 'admin' OR '1'='1' # Questo restituisce TUTTI gli utenti! return query # βœ… CODICE SICURO (USARE PARAMETRI) def get_user_sicuro(username): """Funzione SICURA usando parametri""" query = "SELECT * FROM users WHERE username = %s" # Il connector MySQL gestisce automaticamente l'escape return query, (username,) print("\n🎯 ESEMPIO ATTACCO SQL INJECTION:") malicious_input = "admin' OR '1'='1' -- " print(f"Input malizioso: {malicious_input}") print(f"Query vulnerabile: {get_user_vulnerabile(malicious_input)}") print("β†’ Restituisce TUTTI gli utenti, non solo 'admin'!") print("\nπŸ›‘οΈ BEST PRACTICES PER SICUREZZA:") print("1. USARE SEMPRE PARAMETRI (placeholders %s)") print("2. LIMITARE PERMESSI DATABASE (principio del minimo privilegio)") print("3. VALIDARE INPUT utente (whitelist, type checking)") print("4. USARE PREPARED STATEMENTS") print("5. LOGGING e MONITORING query sospette") print("6. AGGIORNARE REGOLARMENTE software database") print("7. USARE CONNESSIONI SSL/TLS") print("8. BACKUP REGOLARI e recovery plan") # Implementazione sicura class SecureDatabase: """Implementazione sicura di operazioni database""" def __init__(self): self.connection = None def safe_query(self, query, params=None): """Esegue query in modo sicuro""" try: cursor = self.connection.cursor() if params: cursor.execute(query, params) else: cursor.execute(query) return cursor.fetchall() except Error as e: print(f"❌ Errore query: {e}") return [] finally: if cursor: cursor.close() def validate_input(self, input_data, expected_type, max_length=None): """Valida input utente""" # Tipo if not isinstance(input_data, expected_type): return False # Lunghezza massima (se specificata) if max_length and len(str(input_data)) > max_length: return False # Whitelist per campi specifici if expected_type == str: # Rimuovi caratteri pericolosi dangerous_chars = ["'", '"', ";", "--", "/*", "*/", "xp_"] for char in dangerous_chars: if char in input_data: return False return True def audit_log(self, user_id, action, query, params=None): """Log per audit trail""" log_entry = { 'timestamp': datetime.now(), 'user_id': user_id, 'action': action, 'query': query, 'params': params } # Salva in tabella audit_logs print(f"πŸ“ AUDIT LOG: {log_entry}") print("\nπŸ” GESTIONE PASSWORD E CREDENZIALI:") print("❌ MAI fare:") print(" password = 'supersecret' # Hardcoded") print(" connection = mysql.connector.connect(password='plaintext')") print("\nβœ… MEGLIO fare:") print(" 1. Usare variabili d'ambiente") print(" 2. File di configurazione esterni (con permessi ristretti)") print(" 3. Vault di secrets (Hashicorp Vault, AWS Secrets Manager)") print(" 4. Connection pooling con autenticazione sicura") # Esempio con variabili d'ambiente import os from dotenv import load_dotenv print("\n🌐 ESEMPIO CON VARIABILI D'AMBIENTE:") env_example = """ # file: .env (NON commitare su Git!) DB_HOST=localhost DB_USER=ai_app DB_PASSWORD=supersecretpassword123 DB_NAME=ai_enterprise # Nel codice Python: load_dotenv() # Carica variabili da .env connection = mysql.connector.connect( host=os.getenv('DB_HOST'), user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), database=os.getenv('DB_NAME') ) """ print(env_example) print("\nπŸ“Š MONITORING E PERFORMANCE:") print("1. Query lente: Usa EXPLAIN per analizzare") print("2. Index: Crea indici su colonne usate in WHERE, JOIN, ORDER BY") print("3. Connection pooling: Riutilizza connessioni") print("4. Batch operations: Inserisci/aggiorna in batch") print("5. Pagination: LIMIT e OFFSET per grandi dataset") print("6. Caching: Cache risultati query frequenti") print("\nπŸ’‘ CHECKLIST SICUREZZA DATABASE AI:") print("βœ… [ ] Usa parametri per tutte le query") print("βœ… [ ] Limita permessi utente database") print("βœ… [ ] Backup automatici giornalieri") print("βœ… [ ] SSL/TLS per connessioni") print("βœ… [ ] Logging di tutte le operazioni") print("βœ… [ ] Validazione input lato server") print("βœ… [ ] Rate limiting per query") print("βœ… [ ] Monitoraggio query lente") print("βœ… [ ] Aggiornamenti di sicurezza regolari") print("βœ… [ ] Test di penetrazione periodici")

πŸ” GESTIONE CONNESSIONI E PERFORMANCE

Connection Pooling: Non aprire/chiudere connessioni per ogni query!

🚫 COPIA BLOCCATA
# CONNECTION POOLING E PERFORMANCE print("πŸš€ OPTIMIZZAZIONE PERFORMANCE DATABASE") print("=" * 70) import mysql.connector.pooling class DatabasePool: """Gestione connection pooling per performance""" def __init__(self, pool_name="ai_pool", pool_size=5): self.pool = None self.pool_name = pool_name self.pool_size = pool_size def create_pool(self, config): """Crea pool di connessioni""" dbconfig = { "host": config['host'], "user": config['user'], "password": config['password'], "database": config['database'], "pool_name": self.pool_name, "pool_size": self.pool_size, "pool_reset_session": True } try: self.pool = mysql.connector.pooling.MySQLConnectionPool(**dbconfig) print(f"βœ… Pool creato: {self.pool_name} (size: {self.pool_size})") except Error as e: print(f"❌ Errore creazione pool: {e}") def get_connection(self): """Ottiene connessione dal pool""" if self.pool: return self.pool.get_connection() return None def execute_query(self, query, params=None): """Esegue query usando pooling""" connection = None cursor = None try: connection = self.get_connection() if connection: cursor = connection.cursor(dictionary=True) if params: cursor.execute(query, params) else: cursor.execute(query) # Per SELECT, fetch results if query.strip().upper().startswith('SELECT'): results = cursor.fetchall() else: connection.commit() results = cursor.rowcount return results except Error as e: print(f"❌ Errore query: {e}") return None finally: if cursor: cursor.close() if connection: connection.close() # Restituisce connessione al pool def batch_insert(self, table, data_list, batch_size=1000): """Inserimento batch per performance""" if not data_list: return 0 # Prepara colonne e placeholders columns = list(data_list[0].keys()) columns_str = ", ".join(columns) placeholders = ", ".join(["%s"] * len(columns)) query = f"INSERT INTO {table} ({columns_str}) VALUES ({placeholders})" # Prepara dati values = [tuple(item[col] for col in columns) for item in data_list] connection = None cursor = None total_inserted = 0 try: connection = self.get_connection() if connection: cursor = connection.cursor() # Inserisci in batch for i in range(0, len(values), batch_size): batch = values[i:i + batch_size] cursor.executemany(query, batch) connection.commit() total_inserted += len(batch) print(f" β€’ Batch {i//batch_size + 1}: {len(batch)} record inseriti") return total_inserted except Error as e: print(f"❌ Errore batch insert: {e}") if connection: connection.rollback() return 0 finally: if cursor: cursor.close() if connection: connection.close() # DEMOSTRAZIONE PERFORMANCE print("\nπŸ“Š CONFRONTO PERFORMANCE:") print("-" * 40) print("❌ APPROCCIO LENTO:") print(" for record in data:") print(" conn = mysql.connector.connect(...)") print(" cursor = conn.cursor()") print(" cursor.execute('INSERT ...')") print(" conn.commit()") print(" conn.close()") print(" β†’ Ogni record: nuova connessione + commit") print("\nβœ… APPROCCIO OTTIMIZZATO:") print(" 1. Connection pooling") print(" 2. Batch insert (1000 record per volta)") print(" 3. Transaction grouping") print(" 4. Proper indexing") print(" 5. Query optimization") print("\nπŸ” QUERY OPTIMIZATION:") optimization_tips = """ -- ❌ Query lenta (senza indice) SELECT * FROM clienti WHERE citta = 'Roma'; -- βœ… Query ottimizzata -- Prima crea indice: CREATE INDEX idx_clienti_citta ON clienti(citta); -- Poi usa: SELECT id, nome, email FROM clienti WHERE citta = 'Roma'; -- ❌ JOIN inefficiente SELECT * FROM clienti c, ordini o WHERE c.id = o.cliente_id; -- βœ… JOIN efficiente SELECT c.nome, o.data, o.totale FROM clienti c JOIN ordini o ON c.id = o.cliente_id WHERE o.data > '2023-01-01' INDEX (c.id, o.cliente_id, o.data); """ print(optimization_tips) print("\nπŸ“ˆ MONITORING TOOLS:") print("1. EXPLAIN query: ANALYZE execution plan") print("2. MySQL Slow Query Log: Trova query lente") print("3. Performance Schema: Monitora in real-time") print("4. MySQL Workbench: Visual performance dashboard") print("5. Custom monitoring: Log query time > threshold") print("\nπŸ’Ύ BACKUP E RECOVERY:") backup_strategy = """ # Strategia backup 3-2-1: # 3 copie dei dati # 2 tipi di storage diversi # 1 copia offsite # Backup giornaliero completo mysqldump -u root -p ai_enterprise > backup_completo.sql # Backup incrementale # (Usa binary logs) # Automazione con cron 0 2 * * * /path/to/backup_script.sh # Test recovery regolarmente! """ print(backup_strategy) print("\nπŸš€ SCALING DATABASE AI:") print("β€’ VERTICAL: Miglior hardware (RAM, CPU, SSD)") print("β€’ HORIZONTAL: Sharding, replication, clustering") print("β€’ CACHING: Redis/Memcached per query frequenti") print("β€’ READ REPLICAS: Separare letture da scritture") print("β€’ PARTITIONING: Dividere tabelle grandi") print("β€’ ARCHIVING: Sposta dati storici in tabelle separate") print("\nβœ… CHECKLIST PERFORMANCE:") print("βœ… [ ] Connection pooling implementato") print("βœ… [ ] Indici su colonne query frequenti") print("βœ… [ ] Query ottimizzate (EXPLAIN usato)") print("βœ… [ ] Batch operations per inserimenti massivi") print("βœ… [ ] Monitoring query lente attivo") print("βœ… [ ] Backup automatici testati") print("βœ… [ ] Caching per dati statici") print("βœ… [ ] Pagination per grandi risultati") print("βœ… [ ] Connection timeout gestiti") print("βœ… [ ] Error handling robusto")

πŸš€ Progetto: Sistema AI E-commerce con Database

Costruiamo un sistema completo che integra AI e database per un e-commerce.

πŸ“₯ 1. Database: Storico clienti e acquisti
πŸ€– 2. Python: Addestra modello di raccomandazione
πŸ’Ύ 3. Database: Salva modello addestrato
⚑ 4. Real-time: API riceve richiesta cliente
πŸ” 5. Database: Fornisce features cliente
🎯 6. AI: Genera raccomandazioni personalizzate
πŸ“Š 7. Database: Salva raccomandazioni e feedback
πŸ”„ 8. Loop: Nuovo training con dati aggiornati
🚫 COPIA BLOCCATA
# PROGETTO: SISTEMA AI E-COMMERCE COMPLETO print("πŸš€ PROGETTO: SISTEMA AI E-COMMERCE END-TO-END") print("=" * 70) import mysql.connector from mysql.connector import Error, pooling import pandas as pd import numpy as np from datetime import datetime, timedelta import json import pickle from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report from sklearn.preprocessing import StandardScaler import warnings warnings.filterwarnings('ignore') class AIEcommerceSystem: """Sistema completo AI e-commerce con database integration""" def __init__(self, db_config): self.db_config = db_config self.pool = None self.models = {} self.scalers = {} def initialize(self): """Inizializza sistema: pool, modelli, etc.""" print("πŸ”§ INIZIALIZZAZIONE SISTEMA AI E-COMMERCE") print("-" * 50) # 1. Crea connection pool self.create_connection_pool() # 2. Carica/scarica modelli AI self.load_or_train_models() print("βœ… Sistema inizializzato e pronto") def create_connection_pool(self): """Crea pool di connessioni database""" try: self.pool = pooling.MySQLConnectionPool( pool_name="ecommerce_pool", pool_size=10, **self.db_config ) print(f"βœ… Connection pool creato (size: 10)") except Error as e: print(f"❌ Errore creazione pool: {e}") self.pool = None def get_connection(self): """Ottiene connessione dal pool""" if self.pool: try: return self.pool.get_connection() except Error as e: print(f"❌ Errore ottenimento connessione: {e}") return None # ========== MODELLI AI ========== def load_or_train_models(self): """Carica modelli esistenti o addestra nuovi""" print("\nπŸ€– GESTIONE MODELLI AI:") # Lista modelli da gestire models_to_manage = [ ('propensione_acquisto', self.train_purchase_propensity_model), ('raccomandazione', self.train_recommendation_model), ('churn_prediction', self.train_churn_model) ] for model_name, train_function in models_to_manage: print(f"\n πŸ“Š Modello: {model_name}") # Prova a caricare da database model = self.load_model_from_db(model_name) if model: print(f" βœ… Caricato da database") self.models[model_name] = model else: print(f" πŸ”„ Non trovato, addestramento...") model = train_function() if model: self.models[model_name] = model self.save_model_to_db(model_name, model) print(f" πŸ’Ύ Salvato in database") def train_purchase_propensity_model(self): """Addestra modello per predire propensione acquisto""" print(" 🎯 Addestramento modello propensione acquisto...") # Estrai dati dal database query = """ SELECT c.eta, c.punteggio_fidelita, c.frequenza_acquisti, c.totale_acquisti, DATEDIFF(CURDATE(), c.data_ultimo_acquisto) as giorni_dal_ultimo_acquisto, CASE WHEN t.id IS NOT NULL THEN 1 ELSE 0 END as ha_comprato_ultimo_mese FROM clienti c LEFT JOIN transazioni t ON c.id = t.id_cliente AND t.data_transazione >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND t.stato = 'completata' WHERE c.data_registrazione < DATE_SUB(CURDATE(), INTERVAL 60 DAY) LIMIT 10000 """ df = self.execute_query_to_dataframe(query) if df.empty or len(df) < 100: print(" ⚠️ Dati insufficienti per training") return None # Prepara features e target X = df[['eta', 'punteggio_fidelita', 'frequenza_acquisti', 'totale_acquisti', 'giorni_dal_ultimo_acquisto']].fillna(0) y = df['ha_comprato_ultimo_mese'] # Train/test split X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # Scaling scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) self.scalers['propensione_acquisto'] = scaler # Addestra modello model = RandomForestClassifier( n_estimators=100, max_depth=10, random_state=42 ) model.fit(X_train_scaled, y_train) # Valuta y_pred = model.predict(X_test_scaled) accuracy = accuracy_score(y_test, y_pred) print(f" βœ… Addestrato! Accuracy: {accuracy:.3f}") print(f" πŸ“Š Dati: {len(df)} clienti, {X.shape[1]} features") return model def train_recommendation_model(self): """Addestra modello per raccomandazioni (semplificato)""" print(" 🎯 Addestramento modello raccomandazione...") # Per semplicitΓ , restituiamo un modello dummy # In produzione useresti Collaborative Filtering o Matrix Factorization class DummyRecommender: def predict(self, customer_id): # In produzione: logica complessa # Per demo: prodotti piΓΉ popolari return [1, 2, 3, 4, 5] # IDs prodotti raccomandati return DummyRecommender() def train_churn_model(self): """Addestra modello per predire churn clienti""" print(" 🎯 Addestramento modello churn prediction...") # Simile a purchase propensity, ma target diverso # Per demo, modello dummy class DummyChurnModel: def predict_proba(self, X): # Restituisce probabilitΓ  dummy return np.array([[0.7, 0.3]]) # [prob_non_churn, prob_churn] return DummyChurnModel() def load_model_from_db(self, model_name): """Carica modello da database""" query = """ SELECT modello_binario, accuracy, data_addestramento FROM modelli_ai WHERE nome_modello = %s AND stato = 'attivo' ORDER BY data_addestramento DESC LIMIT 1 """ result = self.execute_query(query, (model_name,)) if result: model_binary = result[0]['modello_binario'] if model_binary: try: model = pickle.loads(model_binary) print(f" πŸ“… Addestrato: {result[0]['data_addestramento']}") print(f" 🎯 Accuracy: {result[0]['accuracy']}") return model except: pass return None def save_model_to_db(self, model_name, model): """Salva modello in database""" # Serializza modello model_binary = pickle.dumps(model) # Per demo, calcola accuracy dummy accuracy = 0.85 if 'propensione' in model_name else 0.75 query = """ INSERT INTO modelli_ai (nome_modello, tipo_modello, algoritmo, versione, modello_binario, accuracy, data_addestramento, stato) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) """ values = ( model_name, 'classificazione' if hasattr(model, 'predict_proba') else 'raccomandazione', 'RandomForest' if hasattr(model, 'feature_importances_') else 'Dummy', '1.0', model_binary, accuracy, datetime.now(), 'attivo' ) self.execute_query(query, values, commit=True) # ========== OPERAZIONI BUSINESS ========== def get_customer_recommendations(self, customer_id, limit=5): """Ottiene raccomandazioni per un cliente""" print(f"\n🎯 GENERAZIONE RACCOMANDAZIONI per cliente {customer_id}") # 1. Recupera info cliente da database customer_query = """ SELECT c.id, c.nome, c.cognome, c.segmento, c.punteggio_fidelita, c.totale_acquisti, DATEDIFF(CURDATE(), c.data_ultimo_acquisto) as giorni_dal_ultimo_acquisto FROM clienti c WHERE c.id = %s """ customer_data = self.execute_query(customer_query, (customer_id,)) if not customer_data: print(f" ❌ Cliente {customer_id} non trovato") return [] customer = customer_data[0] # 2. Prepara features per modello AI features = np.array([[ customer['punteggio_fidelita'] or 0, customer['totale_acquisti'] or 0, customer['giorni_dal_ultimo_acquisto'] or 365 ]]) # 3. Predici con modello AI if 'propensione_acquisto' in self.models: scaler = self.scalers.get('propensione_acquisto') if scaler: features_scaled = scaler.transform(features) propensity = self.models['propensione_acquisto'].predict_proba(features_scaled)[0][1] print(f" πŸ“Š Propensione acquisto: {propensity:.3f}") # 4. Ottieni raccomandazioni if 'raccomandazione' in self.models: recommended_ids = self.models['raccomandazione'].predict(customer_id) else: # Fallback: prodotti piΓΉ popolari popular_query = """ SELECT p.id, p.nome, p.prezzo, p.categoria, COUNT(t.id) as numero_vendite FROM prodotti p LEFT JOIN transazioni t ON p.id = t.id_prodotto WHERE p.attivo = TRUE GROUP BY p.id ORDER BY numero_vendite DESC LIMIT %s """ recommended = self.execute_query(popular_query, (limit,)) recommended_ids = [r['id'] for r in recommended] # 5. Recupera dettagli prodotti raccomandati if recommended_ids: products_query = """ SELECT id, sku, nome, categoria, prezzo FROM prodotti WHERE id IN (%s) """ % ','.join(['%s'] * len(recommended_ids)) products = self.execute_query(products_query, recommended_ids) # 6. Salva raccomandazione in database per tracking for product in products: prediction_data = { 'id_cliente': customer_id, 'id_prodotto': product['id'], 'tipo_predizione': 'raccomandazione', 'valore_predizione': 0.8, # Score dummy 'probabilita': 0.75, 'classe_predetta': 'raccomandato', 'features_input': json.dumps({ 'punteggio_fidelita': customer['punteggio_fidelita'], 'segmento': customer['segmento'] }) } self.save_prediction(prediction_data) print(f" βœ… Generate {len(products)} raccomandazioni") return products return [] def update_customer_segment(self, customer_id): """Aggiorna segmento cliente basato su comportamento""" print(f"\nπŸ” ANALISI SEGMENTAZIONE cliente {customer_id}") # Calcola metriche cliente metrics_query = """ SELECT c.totale_acquisti, c.frequenza_acquisti, DATEDIFF(CURDATE(), c.data_ultimo_acquisto) as giorni_inattivita, COUNT(DISTINCT t.id) as transazioni_ultimo_anno FROM clienti c LEFT JOIN transazioni t ON c.id = t.id_cliente AND t.data_transazione >= DATE_SUB(CURDATE(), INTERVAL 365 DAY) WHERE c.id = %s GROUP BY c.id """ metrics = self.execute_query(metrics_query, (customer_id,)) if not metrics: return metrics = metrics[0] # Logica segmentazione semplice if metrics['totale_acquisti'] > 1000 and metrics['transazioni_ultimo_anno'] > 5: new_segment = 'vip' elif metrics['totale_acquisti'] > 500: new_segment = 'premium' elif metrics['giorni_inattivita'] > 180: new_segment = 'inattivo' else: new_segment = 'basic' # Aggiorna database update_query = "UPDATE clienti SET segmento = %s WHERE id = %s" self.execute_query(update_query, (new_segment, customer_id), commit=True) print(f" βœ… Segmento aggiornato: {new_segment}") # Salva predizione segmentazione prediction_data = { 'id_cliente': customer_id, 'tipo_predizione': 'segmentazione', 'classe_predetta': new_segment, 'features_input': json.dumps({ 'totale_acquisti': float(metrics['totale_acquisti']), 'giorni_inattivita': metrics['giorni_inattivita'] }) } self.save_prediction(prediction_data) def generate_daily_insights(self): """Genera insights giornalieri dal database""" print("\nπŸ“ˆ GENERAZIONE INSIGHTS GIORNALIERI") print("-" * 40) insights = {} # 1. Metriche vendite sales_query = """ SELECT DATE(data_transazione) as giorno, COUNT(*) as numero_transazioni, SUM(totale) as fatturato, AVG(totale) as ticket_medio FROM transazioni WHERE data_transazione >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND stato = 'completata' GROUP BY DATE(data_transazione) ORDER BY giorno DESC """ insights['vendite_ultima_settimana'] = self.execute_query(sales_query) # 2. Top prodotti products_query = """ SELECT p.nome, p.categoria, COUNT(t.id) as numero_vendite, SUM(t.totale) as fatturato_totale FROM prodotti p JOIN transazioni t ON p.id = t.id_prodotto WHERE t.data_transazione >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) GROUP BY p.id ORDER BY fatturato_totale DESC LIMIT 10 """ insights['top_prodotti'] = self.execute_query(products_query) # 3. Segmenti clienti piΓΉ redditizi segments_query = """ SELECT c.segmento, COUNT(DISTINCT c.id) as numero_clienti, SUM(t.totale) as fatturato_totale, AVG(t.totale) as fatturato_medio_per_cliente FROM clienti c JOIN transazioni t ON c.id = t.id_cliente WHERE t.data_transazione >= DATE_SUB(CURDATE(), INTERVAL 90 DAY) GROUP BY c.segmento ORDER BY fatturato_totale DESC """ insights['performance_segmenti'] = self.execute_query(segments_query) # 4. Predizioni per oggi predictions_query = """ SELECT tipo_predizione, COUNT(*) as numero_predizioni, AVG(valore_predizione) as valore_medio FROM predizioni WHERE DATE(data_predizione) = CURDATE() GROUP BY tipo_predizione """ insights['predizioni_oggi'] = self.execute_query(predictions_query) # Stampa sommario print(f"πŸ“Š VENDITE: {len(insights['vendite_ultima_settimana'])} giorni analizzati") print(f"πŸ† TOP PRODOTTI: {len(insights['top_prodotti'])} prodotti leader") print(f"πŸ‘₯ SEGMENTI: {len(insights['performance_segmenti'])} segmenti analizzati") print(f"πŸ€– PREDIZIONI: {sum(p['numero_predizioni'] for p in insights['predizioni_oggi'])} oggi") # Salva insights in database per reporting self.save_insights_to_db(insights) return insights # ========== UTILITY DATABASE ========== def execute_query(self, query, params=None, commit=False): """Esegue query e restituisce risultati""" connection = None cursor = None try: connection = self.get_connection() if not connection: return None cursor = connection.cursor(dictionary=True) if params: cursor.execute(query, params) else: cursor.execute(query) if commit: connection.commit() result = cursor.rowcount else: result = cursor.fetchall() return result except Error as e: print(f"❌ Errore query: {e}") print(f" Query: {query[:100]}...") if params: print(f" Params: {params}") return None finally: if cursor: cursor.close() if connection: connection.close() def execute_query_to_dataframe(self, query, params=None): """Esegue query e restituisce DataFrame""" results = self.execute_query(query, params) if results: return pd.DataFrame(results) return pd.DataFrame() def save_prediction(self, prediction_data): """Salva predizione in database""" query = """ INSERT INTO predizioni (id_cliente, id_prodotto, tipo_predizione, valore_predizione, probabilita, classe_predetta, features_input, data_predizione) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) """ values = ( prediction_data.get('id_cliente'), prediction_data.get('id_prodotto'), prediction_data.get('tipo_predizione'), prediction_data.get('valore_predizione'), prediction_data.get('probabilita'), prediction_data.get('classe_predetta'), json.dumps(prediction_data.get('features_input', {})), datetime.now() ) self.execute_query(query, values, commit=True) def save_insights_to_db(self, insights): """Salva insights in database per reporting storico""" # Per semplicitΓ , salviamo come JSON in una tabella dedicata insights_json = json.dumps(insights, default=str) query = """ INSERT INTO insights_giornalieri (data_insight, insights_json, data_creazione) VALUES (%s, %s, %s) """ self.execute_query(query, (date.today(), insights_json, datetime.now()), commit=True) # ========== API SIMULATE ========== def handle_api_request(self, endpoint, data): """Simula handling di richiesta API""" print(f"\n🌐 API REQUEST: {endpoint}") print(f" Data: {data}") if endpoint == '/recommendations': customer_id = data.get('customer_id') limit = data.get('limit', 5) return self.get_customer_recommendations(customer_id, limit) elif endpoint == '/update_segment': customer_id = data.get('customer_id') self.update_customer_segment(customer_id) return {'status': 'success', 'message': 'Segment updated'} elif endpoint == '/daily_insights': insights = self.generate_daily_insights() return insights else: return {'error': 'Endpoint not found'} # DEMOSTRAZIONE SISTEMA COMPLETO print("\nπŸš€ AVVIO SISTEMA AI E-COMMERCE") print("=" * 70) # Configurazione database (usa i tuoi dati) db_config = { 'host': 'localhost', 'user': 'root', 'password': 'password', 'database': 'ai_enterprise' } # Crea sistema system = AIEcommerceSystem(db_config) # Inizializza (commenta se non hai MySQL) # system.initialize() print("\nπŸ“‹ SIMULAZIONE FLUSSO COMPLETO:") print("-" * 50) # Simula richiesta API per raccomandazioni print("\n1️⃣ πŸ“± CLIENTE ACCEDE ALL'APP:") print(" Richiede raccomandazioni personalizzate") # Simula API call api_response = system.handle_api_request('/recommendations', { 'customer_id': 1, 'limit': 3 }) if api_response: print("\n 🎁 RACCOMANDAZIONI GENERATE:") for i, product in enumerate(api_response[:3], 1): print(f" {i}. {product['nome']} - €{product['prezzo']} ({product['categoria']})") print("\n2️⃣ πŸ”„ AGGIORNAMENTO AUTOMATICO:") print(" Sistema aggiorna segmento cliente basato su comportamento") system.handle_api_request('/update_segment', {'customer_id': 1}) print("\n3️⃣ πŸ“Š REPORTING GIORNALIERO:") print(" Generazione insights automatici") insights = system.handle_api_request('/daily_insights', {}) print("\n4️⃣ πŸ€– TRAINING AUTOMATICO:") print(" Sistema ri-addestra modelli con nuovi dati") print(" (Ogni notte o quando accuracy scende sotto threshold)") print("\n5️⃣ πŸ“ˆ MONITORING:") print(" β€’ Performance modelli") print(" β€’ Accuratezza predizioni") print(" β€’ Tempo risposta API") print(" β€’ Utilizzo database") print("\nπŸ’‘ ARCHITETTURA COMPLETA IMPLEMENTATA:") print("βœ… Database MySQL: Storage persistente") print("βœ… Python AI Models: Logica intelligente") print("βœ… Connection Pooling: Performance ottimizzata") print("βœ… API Layer: Comunicazione esterna") print("βœ… Batch Processing: Training notturno") print("βœ… Monitoring: Controllo continuo") print("βœ… Backup: Sicurezza dati") print("\n🎯 VANTAGGI DI QUESTA ARCHITETTURA:") print("β€’ πŸ“Š Dati persistenti e consistenti") print("β€’ πŸš€ Scalabile (piΓΉ server, load balancing)") print("β€’ πŸ”’ Sicuro (SQL injection prevention, auth)") print("β€’ πŸ“ˆ Monitorabile (logging, metrics)") print("β€’ πŸ”„ Mantenibile (separazione concerns)") print("β€’ πŸ’Ύ Recuperabile (backup, recovery plan)") print("\nπŸš€ PROSSIMI PASSI PER PRODUCTION:") print("1. Containerizzazione (Docker)") print("2. Orchestrazione (Kubernetes)") print("3. Message Queue (RabbitMQ/Kafka)") print("4. Caching Layer (Redis)") print("5. Monitoring avanzato (Prometheus/Grafana)") print("6. CI/CD Pipeline") print("7. Auto-scaling") print("8. Disaster Recovery") print("\nβœ… PROGETTO COMPLETATO!") print("Hai costruito un sistema AI e-commerce enterprise-ready!")

πŸ’ͺ Esercizi Pratici

Esercizio 1: Database per AI Healthcare MEDIO

Obiettivo: Progettare database per sistema diagnostico AI

Scenario: Ospedale che usa AI per diagnosi precoci

Tasks:

  1. Progetta schema database con 5+ tabelle
  2. Crea script SQL per creazione
  3. Implementa Python class per operazioni CRUD
  4. Aggiungi stored procedure per statistiche
  5. Testa con dati simulati

Esercizio 2: Sistema di Trading Algorithmico DIFFICILE

Obiettivo: Database per trading AI high-frequency

Requisiti:

  • Storage prezzi in tempo reale (ogni secondo)
  • Predizioni modelli AI
  • Storico trades eseguiti
  • Performance analytics

Bonus: Implementa data partitioning per performance

Esercizio 3: Social Media AI Recommender MEDIO

Obiettivo: Database per sistema raccomandazione social

Entities: Utenti, Post, Like, Commenti, Amicizie

Tasks:

  1. Design schema relazionale complesso
  2. Implementa GraphQL-like queries
  3. Crea Python API per raccomandazioni
  4. Ottimizza per query frequenti
  5. Testa con dataset simulato (100k utenti)

🎯 Riepilogo e Prossimi Passi

πŸ—„οΈ COSA ABBIAMO IMPARATO SUI DATABASE

  • Design schema database per AI
  • MySQL Connector Python integration
  • Operazioni CRUD sicure
  • Connection pooling e performance
  • SQL injection prevention
  • Backup e recovery strategies

πŸ€– INTEGRAZIONE AI + DATABASE

  • Estrarre dati per training
  • Salvare modelli addestrati
  • Storage predizioni per monitoraggio
  • Real-time feature retrieval
  • Feedback loop per retraining
  • Analytics e reporting

🎯 CHECKLIST PROGETTO AI + DATABASE

Design: Schema normalizzato, relazioni, indici

Sicurezza: Parametri SQL, validation, auth

Performance: Pooling, indexing, caching

AI Integration: Training data, model storage, predictions

Monitoring: Query performance, accuracy tracking

Backup: Automazione, testing recovery

Scalability: Sharding, replication, partitioning

πŸ† Pronto per il Progetto Finale!

Ora hai tutti gli strumenti: Scikit-Learn, Reti Neurali, Database MySQL.
Nel modulo finale uniremo tutto in un progetto AI completo su dataset reale!

Vai al Modulo 5: Progetto Finale β†’