如何在Python中捕获MongoDB和PyMongo的OperationFailure
我遇到了一个问题,就是我的Django应用通过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(),那么就可以正常重新验证身份并执行查询,但我不想在每次查询时都重新验证身份。对于如何正确处理这个问题,欢迎提出其他建议,非常感谢大家的帮助。
谢谢!
1 个回答
7
你可以试试用 find_one(),而不是 find()。后者不会自动遍历游标。
我刚刚在一个需要认证的数据库上试了一下,这样做是有效的:
try:
connection.test.foo.find_one()
except pymongo.errors.OperationFailure:
print "caught"