2010-08-09 23 views
6

J'ai eu un problème où après que ma connexion mongodb à mongohq via pymongo devienne inactive pendant un certain temps (pas de requêtes), il va expirer. C'est bien, mais la connexion à la base de données n'est créée que lorsque l'application Django est démarrée. Il semble que la connexion se rétablisse bien, mais elle doit alors être réauthentifiée. Lorsque la connexion est morte et reconnectée, et qu'une requête tente de s'exécuter, elle déclenche un OperationFailure et la valeur d'exception suivante database error: unauthorized for db [shanereustle] lock type: -1 qui indique que la connexion est en cours, mais pas l'authentification. J'ai importé OperationFailure de pymongo.errors et essaye d'employer l'essai suivant ... excepté mais je ne peux pas sembler attraper l'erreur, et m'authentifier.Comment attraper un OperationFailure de MongoDB et PyMongo en Python

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

Mais pour une raison quelconque, cela n'attrape pas. Si au lieu de ce code, je lance simplement db.authenticate() avant la requête, il va se réauthentifier correctement et aller bien, mais je ne veux pas réauthentifier sur chaque requête. D'autres suggestions sur les façons appropriées de le faire sont les bienvenues et j'apprécie l'aide.

Merci!

Répondre

6

Pouvez-vous essayer un find_one() au lieu de find(). Ce dernier ne parcourt pas automatiquement le curseur.

Je viens d'essayer cela avec une base de données --auth, et cela a fonctionné:

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

Parfait! Maintenant, voici une autre chose que j'ai remarquée après l'implémentation. La toute première fois qu'une requête est exécutée une fois que la connexion meurt, elle déclenche AutoReconnect. Chaque page après cela soulève OperationFailure. Est-ce que je peux essayer, sauf, sauf? Je pourrais d'abord vérifier l'AutoReconnect, puis l'OperationFailure? Merci! –

+3

Mise à jour: Vous pouvez utiliser plusieurs exceptions, par exemple: 'except (AutoReconnect, OperationFailure):' –