python - Insert_many ব্যবহার করে কীভাবে কীভাবে ত্রুটিগুলি নিরাপদে উপেক্ষা করবেন



mongodb pymongo (1)

পাইংগোর সাথে ইনসার্ট_ম্যানি ব্যবহার করার সময় আমাকে নকল সন্নিবেশগুলি উপেক্ষা করতে হবে, যেখানে ডুপ্লিকেটগুলি সূচকের ভিত্তিতে রয়েছে। আমি এই প্রশ্নটি স্ট্যাকওভারফ্লোতে জিজ্ঞাসা করে দেখেছি, তবে আমি কোনও কার্যকর উত্তর দেখিনি।

আমার কোড স্নিপেট এখানে:

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 = filter(lambda x: x['code'] != 11000, e.details['writeErrors'])

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

এটি আপনাকে সদৃশ কী ত্রুটি উপেক্ষা করার জন্য একটি ব্যবস্থা দেয় তবে অবশ্যই কোনও সমস্যা যা এমন কোনও বিষয়ে মনোযোগ দিচ্ছে।





pymongo