Come gestire gli errori di connessione in Python con MySQL?

👤 Iniziato da @michelalombardo87
📅 31/07/2025 12:00
📁 Programmazione 🌐 IT
Avatar di michelalombardo87
Ciao a tutte! Sono alle prese con un progetto in Python (versione 3.9) che deve interagire con un database MySQL. Purtroppo continuo a ricevere errori di connessione e non capisco se dipende dal mio codice o da qualche impostazione del database. Ho già provato a cercare soluzioni online ma non riesco a venirne a capo.

Ecco il codice che sto usando:
```python
import mysql.connector

try:
conn = mysql.connector.connect(
host="localhost",
user="michela",
password="mypassword",
database="mydb"
)
print("Connessione riuscita!")
except mysql.connector.Error as err:
print(f"Errore: {err}")
```
L'errore che ricevo è:
`mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'localhost:3306'`

Ho verificato che il servizio MySQL sia attivo e ho anche provato a cambiare porta, ma nulla. Qualcuna ha avuto esperienze simili? Forse devo configurare qualcosa nel file my.cnf? O c'è qualche dettaglio che mi sfugge nella stringa di connessione? Ogni suggerimento è ben accetto, anche per gestire meglio gli errori in generale con MySQL e Python!
Avatar di samantabruno
Io partirei dal verificare se MySQL è effettivamente in ascolto sulla porta 3306. Apri il terminale e digita `sudo netstat -tuln | grep 3306` – se non vedi nessuna riga con "LISTEN", il server non è configurato correttamente. Controlla anche il file my.cnf: se trovi `bind-address = 127.0.0.1` prova a sostituirlo con `bind-address = 0.0.0.0` (non dimenticare di riavviare MySQL dopo). Hai detto di aver cambiato porta, ma nel codice non c'è nessun parametro "port" specificato – forse manca proprio quell'opzione? Prova ad aggiungere `port=3307` o il numero che hai configurato. Un'altra cosa fastidiosa: a volte i firewall locali bloccano le porte interne. Se usi Linux, disabilita temporaneamente UFW con `sudo ufw disable` e vedi se funziona. Ah, e controlla anche che l'utente "michela" abbia i permessi per accedere da localhost (o da dove stai effettivamente connettendoti). Ultimo appunto: evita di usare `localhost` come host se non sei sicura di come sia mappato – prova con `127.0.0.1` diretto. Poi fammi sapere!
Avatar di aBrown992
Samanta ha toccato punti fondamentali, ma vorrei sottolineare un dettaglio che spesso passa inosservato: la differenza tra "localhost" e "127.0.0.1" su sistemi Linux e Windows. Su molte distro, "localhost" risolve a socket Unix, mentre la libreria mysql.connector potrebbe aspettarsi una connessione TCP. Prova a cambiare `host="localhost"` in `host="127.0.0.1"` e aggiungi esplicitamente il parametro `port=3306` (o la porta corretta).

Inoltre, verifica la configurazione del file my.cnf, ma soprattutto accertati che MySQL accetti connessioni TCP, non solo tramite socket. Se `bind-address` è settato a 127.0.0.1 va bene, ma se è disabilitato o commentato, può creare problemi.

Infine, controlla i permessi utente: spesso l’utente "michela" potrebbe non avere accesso da `localhost` ma solo da `%` o viceversa. Puoi fare una prova veloce da terminale con:

```bash
mysql -u michela -p -h 127.0.0.1 -P 3306
```

Se anche lì fallisce, il problema è lato DB. Non sottovalutare mai i permessi e il firewall locale, sono le cause più "insidiose" di questi errori. Se poi vuoi gestione errori più robusta, usa il modulo `logging` per loggare dettagli e pensa a riconnessioni automatiche con backoff esponenziale: evitare di fermare l’app a ogni disconnessione è vitale in produzione.
Avatar di nivesbarbieri
Michela, ti capisco, ci sono passata anch'io (e mi è venuta la rogna). Parto dal sospetto più probabile: se hai **MySQL in ascolto solo via socket Unix** invece che TCP. Quando usi `localhost` in Python, il connector potrebbe provare a connettersi attraverso il socket (es. `/var/run/mysqld/mysqld.sock`), ma se non è configurato correttamente o il file non esiste, boom. Sostituisci `host="localhost"` con `host="127.0.0.1"` **e aggiungi il parametro `port=3306`**. Così forzi la connessione TCP, bypassando il socket.

Poi, controlla il file `my.cnf` (o `mysqld.cnf` in `/etc/mysql/`): cerca la riga `bind-address`. Se è commentata o assente, aggiungi `bind-address = 127.0.0.1` (non 0.0.0.0 se non vuoi aprire a tutti). Riavvia MySQL con `sudo systemctl restart mysql` e verifica che la porta sia in ascolto con `ss -tuln | grep 3306`.

Se ancora non funziona, testa l’accesso **da terminale**: `mysql -u michela -p -h 127.0.0.1 -P 3306`. Se fallisce anche qui, il problema è nei permessi dell’utente o in MySQL stesso. Controlla i privilegi con `SHOW GRANTS FOR 'michela'@'localhost';` e `SHOW GRANTS FOR 'michela'@'127.0.0.1';` – spesso l’utente è autorizzato solo per uno dei due.

Ah, e se stai usando SELinux o AppArmor, disattivali temporaneamente. A volte bloccano pure l’aria.

Poi mi dirai se ti sei pentita di avermi dato retta. 😜
Avatar di michelalombardo87
Nives, grazie mille per tutti questi dettagli! Mi hai fatto venire un po' di nostalgia per i giorni in cui l'unico mio problema era perdermi nei pensieri invece che nei file di configurazione 😅. Ho provato come hai detto e cambiare a 127.0.0.1 ha funzionato! Era proprio il socket a darmi noia. Adesso controllo anche i privilegi per sicurezza, non si sa mai. E ovviamente SELinux è lì che aspetta per rovinarmi la giornata, ma per ora lo lascio dormire. Grazie davvero, sei stata preziosa!
Avatar di rSmith756
@michelalombardo87 Ah, quella nostalgia delle complicazioni "leggere"... ti capisco troppo bene! 😅 Cambiare a 127.0.0.1 è spesso la chiave per sbloccare queste connessioni insidiose, soprattutto quando il socket fa il prepotente. Bravo a controllare i privilegi, perché davvero, anche un minimo errore lì può farti impazzire senza motivo.

Sul discorso SELinux, ti dico: io lo tengo disabilitato durante lo sviluppo, perché quando decide di mettersi di traverso è una tragedia infinita, ma ovviamente in produzione devi fare i conti con lui. Se vuoi un consiglio, potresti dare un’occhiata a `audit2allow` per creare regole personalizzate senza disabilitarlo completamente, così ti eviti sorprese quando “si sveglia”.

Ah, e se ti serve un break mentale, ti consiglio un libro che mi ha aiutato a non perdere la testa con questi errori: “Thinking in Systems” di Donella Meadows. Ti fa vedere i problemi come ingranaggi interconnessi, molto utile per debug mentali e di codice! Forza e avanti così, sei sulla strada giusta.
Avatar di valormonti37
@rSmith756 Concordo al 100% sul consiglio di `audit2allow`! L'ho usato in produzione l'anno scorso per un modulo Python custom e ti dico, quella bestia di SELinux mi ha fatto rigare i contatori per giorni. Ho imparato a generare le policy passo-passo: ogni singola regola l'ho verificata tre volte prima di applicarla (so di essere maniacale, ma meglio che ritrovarsi servizi bloccati a mezzanotte 😤).

Sul libro che suggerisci: letto due volte! Meadows spiega in modo geniale come il debugging assomigli a un sistema di leve - cambi un parametro e tutto crolla o si aggiusta. Però se permetti, aggiungerei "The Unix Programming Environment" di Kernighan: quando i socket mi fanno impazzire, rileggere i fondamenti mi raddrizza la prospettiva.

PS: Disattivare SELinux in sviluppo? Sacrosanto, ma io tengo un log dedicato solo ai suoi audit. Prima di passare in produzione, confronto ogni riga con un diff. Troppo? Forse. Ma non ho mai avuto incidenti 😉
Avatar di questgrassi55
@valormonti37 Ma quanto mi piaci con quel livello di meticolosità! Il tuo approccio a SELinux è pura poesia sistemistica, anche se ammetto che dopo il terzo audit alle 3 di notte avrei probabilmente lanciato il server dalla finestra 😂.

Sul libro di Kernighan: assolutamente d’accordo, è come una bibbia. Ogni volta che credi di sapere tutto, rileggi un capitolo e scopri dettagli che avevi dato per scontato. E poi, quella prosa così pulita… sembra scrivere codice anche quando parla di socket!

Il tuo PS è oro: quel log con il diff è la versione tecnologica del “misura due volte, taglia una”. Io faccio lo stesso, ma con una twist da fotografo: screenshot delle config prima/dopo, perché a volte un’immagine vale più di mille audit log. Continua così, che il mondo ha bisogno di maniaci come te!

(P.S.: Se non l’hai già letto, “The Pragmatic Programmer” ha un capitolo su SELinux che è un gioiello di praticità. Lo sfoglio ogni volta che la bestia ringhia.)

La Tua Risposta

💬

Vuoi partecipare alla discussione?

Accedi o registrati per scrivere la tua risposta e unirti alla conversazione!