2010-02-18 15 views
7

sto usando Python con MySQL e Django. Continuo a vedere questo errore e non riesco a capire dove l'eccezione viene gettata:Chi sta lanciando (e prendendo) questa Eccezione MySQL?

Exception _mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now") in <bound method Cursor.__del__ of <MySQLdb.cursors.Cursor object at 0x20108150>> ignored

ho molti "provare" e "eccezione" blocchi nel mio codice - se il si è verificata un'eccezione in uno di questi, quindi avrei visto i miei messaggi di debug. L'eccezione sopra è ovviamente catturata da qualche parte poiché il mio programma non si interrompe quando viene lanciata l'eccezione.

Sono molto perplesso, qualcuno può darmi una mano?

risposta

3

Questo è un errore Python.

Vedi: http://eric.lubow.org/2009/python/pythons-mysqldb-2014-error-commands-out-of-sync/

Sembra che ci sia un problema con il MySQLdb Query.

+1

grazie per il collegamento. Non uso alcuna query MySQL esplicita o utilizzo alcun oggetto cursore. Tutte le domande che faccio attraverso oggetti Django. Un grosso problema per me non è riuscire a vedere dove viene generata questa eccezione. –

+0

Ripresa: come in php, non è possibile aprire una seconda connessione mysql senza chiudere il primo! –

2

Credo che questo errore si possa verificare se si utilizza la stessa connessione/cursore da più thread. Tuttavia, non credo che i creatori di Django abbiano commesso un tale errore, ma se stai facendo qualcosa da solo, può facilmente accadere.

+0

Non ho il multithreading nel mio programma, anche solo una istanza del mio programma è in esecuzione. Dovrei essere l'unico ad accedere al database quando il mio programma è in esecuzione. Esistono tecniche di debug per vedere dove viene generata l'eccezione? Ho il mio programma impostato per eseguire un grande set di dati. Se provo solo un piccolo sottoinsieme di dati, tutto è ok. Ma quando l'ho impostato per funzionare sull'intero set, questa eccezione MySQL appare ... Al momento, sto eseguendo l'intero set e eseguendo il piping sia standard che standard error per vedere se riesco a farmi un'idea migliore di dove il problema sta mostrando. –

2

Dopo aver stampato un sacco di cose e il debug, ho capito il problema. Una delle librerie che ho usato non ha chiuso la connessione o il cursore. Ma questo problema si manifesta solo se eseguo una grande quantità di dati. Il problema è anche molto discontinuo e non so ancora chi stia lanciando l'eccezione "command out of sync". Ma ora che abbiamo chiuso sia la connessione che il cursore, non vedo più gli errori.

4

Avevo esattamente quell'errore (usando MySQLdb e Django) e ho scoperto che il motivo per cui era "ignorato" era che si era verificato in un metodo __del__. Le eccezioni a __del__ sono categoricamente ignorati: object.__del__ datamodel

Non sembra essere un modo per prendere da più in alto lo stack (almeno secondo this thread), ma è possibile modificare MySQLdb/cursors.py o scimmia- patch per ottenere il proprio __del__ lì che cattura l'eccezione e ti fa cadere in un prompt pdb o registra un traceback completo.

+0

Sei mai stato in grado di determinare il codice specifico che alla fine causava l'errore? Mi chiedo se c'è un problema specifico con l'uso di mysql all'interno di Django, un modulo comune o il mio codice in particolare. –

+1

Il problema di root era totalmente colpa mia (condivisione di una connessione db tra thread), e l'eccezione si verifica quando si chiude la connessione, nel tentativo di svuotare un set di risultati. La sola colpa di Django nella questione era, come al solito, rendendo impossibile eseguire il debug quando succede qualcosa di inaspettato. –

Problemi correlati