我使用pymongo python模块工作mongodb数据库。我的代码中有一个函数,在调用时更新集合中的记录,如下所示。
for record in coll.find(<some query here>):
#Code here
#...
#...
coll.update({ '_id' : record['_id'] },record)
现在,如果我按如下方式修改代码:
for record in coll.find(<some query here>):
try:
#Code here
#...
#...
coll.update({ '_id' : record['_id'] },record,safe=True)
except:
#Handle exception here
这是否意味着当更新失败或没有引发异常时抛出异常并且更新只会跳过导致问题的记录?
请帮助 谢谢
答案 0 :(得分:3)
try
和except
永远不会导致抛出异常。他们只是处理抛出的异常。
如果update
在失败时抛出异常,except
将处理异常,那么循环将继续(除非您在raise
子句中使用except
。
如果update
在失败时没有抛出异常,而是返回None
(或类似的东西),并且想要它抛出异常,那么你可以使用:
if coll.update(...) is None: # or whatever it returns on failure
raise ValueError # or your custom Exception subclass
请注意,您应该始终指定要捕获的异常,并且只围绕要用try
捕获它的代码行,这样您就不会在代码中隐藏其他错误:
for record in coll.find(<some query here>):
#Code here
#...
#...
try:
coll.update({ '_id' : record['_id'] },record,safe=True)
except SpecificException:
#Handle exception here
except OtherSpecificException:
#Handle exception here
else:
#extra stuff to do if there was no exception
答案 1 :(得分:3)
如果数据库响应错误,则使用safe=True
将导致异常(类型pymongo.errors.OperationFailure
或子类)被抛出(有关详细信息,请参阅the pymongo docs)。例如,这里我在唯一索引上导致重复键冲突:
>>> db.bar.insert({'a': 1, 'b': 1})
ObjectId('4e4bc586c67f060b25000000')
>>> db.bar.ensure_index('a', unique=True)
u'a_1'
>>> db.bar.insert({'a': 2, 'b': 1}, safe=True)
ObjectId('4e4bc71fc67f060b25000003')
>>> db.bar.update({'a': 2}, {'a': 1}, safe=True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 368, in update
spec, document, safe, kwargs), safe)
File "/Library/Python/2.7/site-packages/pymongo/connection.py", line 770, in _send_message
return self.__check_response_to_last_error(response)
File "/Library/Python/2.7/site-packages/pymongo/connection.py", line 718, in __check_response_to_last_error
raise DuplicateKeyError(error["err"])
pymongo.errors.DuplicateKeyError: E11000 duplicate key error index: test.bar.$a_1 dup key: { : 1 }
(请注意,DuplicateKeyError
是OperationFailure
的子类,因此except OperationFailure: ...
可以按预期工作。)
除update()
,save()
,insert()
和remove()
之外,所有人都接受safe
关键字参数。您还可以在safe
级别设置Connection
,这样您就不必在每次修改数据库的调用中都包含它。