2010-08-09 5 views
6

Mam problem, gdy po moim połączeniu mongody z mongohq przez pymongo idą bezczynnie przez chwilę (bez zapytań), to będzie to limit czasu. Jest to w porządku, ale połączenie z bazą danych jest tworzone tylko po uruchomieniu aplikacji Django. Wygląda na to, że łączy się dobrze, ale musi wtedy ponownie się uwierzytelnić. Kiedy połączenie zginie i zostanie ponownie nawiązane, a zapytanie będzie próbowało zostać uruchomione, powstaje OperationFailure i następująca wartość wyjątku: database error: unauthorized for db [shanereustle] lock type: -1, która mówi, że ponownie się łączy, ale nie uwierzytelnia. Zaimportowałem OperationFailure z pymongo.errors i próbowałem użyć następującego polecenia ... z wyjątkiem, ale nie mogę wychwycić błędu i uwierzytelnić.Jak złapać OperationFailure z MongoDB i PyMongo w Pythonie

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

Ale z jakiegoś powodu to nie łapie. Jeśli zamiast tego kodu, po prostu uruchomię db.authenticate() przed zapytaniem, będzie on ponownie uwierzytelniał się dobrze i działa dobrze, ale nie chcę go ponownie uwierzytelniać przy każdym zapytaniu. Inne sugestie na temat właściwych sposobów, aby to zrobić są bardzo mile widziane i doceniam pomoc.

Dzięki!

Odpowiedz

6

Można spróbować find_one() zamiast find(). Ten ostatni nie wykonuje automatycznie iteracji po kursie.

Właśnie próbowałem z --auth bazy danych, i to działało:

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

Perfect! Oto kolejna rzecz, którą zauważyłem po wdrożeniu tego. Po pierwszym uruchomieniu zapytania po zgaśnięciu połączenia następuje automatyczne wywołanie funkcji AutoReconnect. Każda kolejna strona podnosi OperationFailure. Czy jest jakiś sposób, aby spróbować, z wyjątkiem, z wyjątkiem? Mogłem najpierw sprawdzić AutoReconnect, a następnie OperationFailure? Dzięki! –

+3

Aktualizacja: Można użyć wielu wyjątków, np .: 'except (AutoReconnect, OperationFailure):' –