gpt4 book ai didi

python - 如何使用 insert_many 安全地忽略重复键错误

转载 作者:太空狗 更新时间:2023-10-30 00:34:27 25 4
gpt4 key购买 nike

在将 insert_many 与 pymongo 一起使用时,我需要忽略重复插入,其中重复项基于索引。我在 stackoverflow 上看到过这个问题,但没有看到有用的答案。

这是我的代码片段:

try:
results = mongo_connection[db][collection].insert_many(documents, ordered=False, bypass_document_validation=True)
except pymongo.errors.BulkWriteError as e:
logger.error(e)

我希望 insert_many 忽略重复项而不抛出异常(这会填满我的错误日志)。或者,有没有我可以使用的单独的异常处理程序,这样我就可以忽略错误。我想念“w=0”...

谢谢

最佳答案

您可以通过检查 BulkWriteError 产生的错误来处理这个问题。这实际上是一个具有多个属性的“对象”。有趣的部分在 details 中:

import pymongo
from bson.json_util import dumps
from pymongo import MongoClient
client = MongoClient()
db = client.test

collection = db.duptest

docs = [{ '_id': 1 }, { '_id': 1 },{ '_id': 2 }]


try:
result = collection.insert_many(docs,ordered=False)

except pymongo.errors.BulkWriteError as e:
print e.details['writeErrors']

在第一次运行时,这将在 e.details['writeErrors'] 下给出错误列表:

[
{
'index': 1,
'code': 11000,
'errmsg': u'E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 1 }',
'op': {'_id': 1}
}
]

第二次运行时,您会看到三个错误,因为所有项目都存在:

[
{
"index": 0,
"code": 11000,
"errmsg": "E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 1 }",
"op": {"_id": 1}
},
{
"index": 1,
"code": 11000,
"errmsg": "E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 1 }",
"op": {"_id": 1}
},
{
"index": 2,
"code": 11000,
"errmsg": "E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 2 }",
"op": {"_id": 2}
}
]

因此,您需要做的就是过滤数组以查找具有 "code": 11000 的条目,然后仅当其中有其他内容时才“ panic ”

panic = filter(lambda x: x['code'] != 11000, e.details['writeErrors'])

if len(panic) > 0:
print "really panic"

这为您提供了一种忽略重复键错误的机制,但当然要注意一些实际存在的问题。

关于python - 如何使用 insert_many 安全地忽略重复键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44838280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com