【问题标题】:How to catch an OperationFailure from MongoDB and PyMongo in Python如何在 Python 中从 MongoDB 和 PyMongo 捕获 OperationFailure
【发布时间】:2011-03-27 09:59:30
【问题描述】:

我一直有一个问题,在我通过 pymongo 连接到 mongohq 的 mongodb 连接空闲一段时间(没有查询)后,它会超时。这很好,但数据库连接仅在 Django 应用程序启动时创建。它似乎重新连接正常,但它需要重新验证。当连接断开并重新连接,并且查询尝试运行时,它会引发OperationFailure 和以下异常值database error: unauthorized for db [shanereustle] lock type: -1,它告诉我它正在重新连接,但未进行身份验证。我已经从pymongo.errors 导入了OperationFailure,并且一直在尝试使用以下try...except,但我似乎无法捕捉到错误并进行身份验证。

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

但由于某种原因,这并没有捕捉到。如果我只是在查询之前运行 db.authenticate() 而不是这段代码,它会重新验证并正常运行,但我不想在每个查询上重新验证。非常欢迎其他有关正确方法的建议,感谢您的帮助。

谢谢!

【问题讨论】:

    标签: python django mongodb pymongo


    【解决方案1】:

    您可以尝试使用 find_one() 代替 find()。后者不会自动遍历光标。

    我刚刚用 --auth 数据库尝试了这个,它成功了:

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

    【讨论】:

    • 完美!现在,这是我在实施后注意到的另一件事。一旦连接中断,第一次运行查询时,它会引发 AutoReconnect。之后的每一页都会引发 OperationFailure。有什么办法可以尝试,除了,除了?我可以先检查 AutoReconnect,然后再检查 OperationFailure?谢谢!
    • 更新:可以使用多个异常,例如:except (AutoReconnect, OperationFailure):
    猜你喜欢
    • 2013-02-25
    • 2011-10-05
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 2019-02-11
    • 2021-02-01
    相关资源
    最近更新 更多