Question about safe=True parameter for update operation of mongodb

淺唱寂寞╮ 提交于 2019-12-10 15:59:54

问题


Im working a mongodb database using pymongo python module. I have a function in my code which when called updates the records in the collection as follows.

for record in coll.find(<some query here>):
   #Code here
   #...
   #...
   coll.update({ '_id' : record['_id'] },record)

Now, if i modify the code as follows :

for record in coll.find(<some query here>):
   try:
       #Code here
       #...
       #...
       coll.update({ '_id' : record['_id'] },record,safe=True)
   except:
        #Handle exception here

Does this mean an exception will be thrown when update fails or no exception will be thrown and update will just skip the record causing a problem ?

Please Help Thank you


回答1:


try and except never cause an exception to be thrown. They simply handle thrown exceptions.

If update throws an exception on failure, the except will handle the exception, then the loop will continue (unless you use raise in the except clause).

If update doesn't throw an exception on failure, but instead returns None (or something like that), and you want it to throw an exception, you can use:

if coll.update(...) is None: # or whatever it returns on failure
    raise ValueError # or your custom Exception subclass

Note you should always specify which exception you want to catch, and only surround the lines of code where you want to catch it with try, so you don't hide other errors in your code:

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

See the try Statement, Built-in Exceptions, and Errors and Exceptions.




回答2:


Using safe=True will cause exceptions (of type pymongo.errors.OperationFailure or subclasses) to be thrown (see the pymongo docs for more information) if the database responds with an error. For example, here I cause a duplicate key violation on a unique index:

>>> 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 }

(Note that DuplicateKeyError is a subclass of OperationFailure, so except OperationFailure: ... would work as expected).

In addition to update(), save(), insert(), and remove() all accept the safe keyword argument. You can also set safe at the Connection level, so that you don't have to include it in each call that modifies the database.



来源:https://stackoverflow.com/questions/7092407/question-about-safe-true-parameter-for-update-operation-of-mongodb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!