2010-08-09 17 views
6

Ho avuto un problema in cui dopo che la mia connessione mongodb a mongohq via pymongo va inattiva per un po '(senza domande), verrà timeout. Questo va bene, ma la connessione al database viene creata solo all'avvio dell'applicazione Django. Sembra che stia ricollegando bene, ma è necessario riautenticarlo. Quando la connessione è deceduta e ricollegata e una query tenta di essere eseguita, viene generato un valore OperationFailure e il seguente valore di eccezione database error: unauthorized for db [shanereustle] lock type: -1 che indica che è in corso la riconnessione, ma non l'autenticazione. Ho importato OperationFailure da pymongo.errors e sto provando a usare il seguente tentativo ... tranne ma non riesco a percepire l'errore e ad autenticarlo.Come prendere un OperationFailure da MongoDB e PyMongo in Python

try: 
    db.mongohq.shanereustle.blog.find() 
except OperationFailure: 
    db.authenticate() #this function reauthenticates the existing connection 

Ma per qualche motivo questo non cattura. Se invece di questo codice, eseguo semplicemente db.authenticate() prima della query, reauthenticate correttamente e va bene, ma non voglio eseguire nuovamente l'autenticazione su ogni query. Altri suggerimenti su come comportarsi correttamente sono molto graditi e apprezzo l'aiuto.

Grazie!

risposta

6

Puoi provare a find_one() invece di find(). Quest'ultimo non scorre il cursore automaticamente.

Ho appena provato questo con un database --auth, e ha funzionato:

try: 
    connection.test.foo.find_one() 
except pymongo.errors.OperationFailure: 
    print "caught" 
+0

Perfetto! Ora, ecco un'altra cosa che ho notato dopo l'implementazione di questo. La prima volta che viene eseguita una query una volta che la connessione è terminata, viene generato AutoReconnect. Ogni pagina dopo di ciò solleva OperationFailure. C'è un modo per provare, tranne, tranne? Potrei controllare prima AutoReconnect e poi OperationFailure? Grazie! Aggiornamento –

+3

: è possibile utilizzare più eccezioni, ad es .: 'tranne (AutoReconnect, OperationFailure):' –

Problemi correlati