Использование safe=True
приведет к возникновению исключений (типа pymongo.errors.OperationFailure
или подклассов) (см. 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
, чтобы вам не приходилось включать его в каждый вызов, который изменяет базу данных.