Python Mongoengine:如何绕过无法通过验证的文档以避免崩溃

Posted

技术标签:

【中文标题】Python Mongoengine:如何绕过无法通过验证的文档以避免崩溃【英文标题】:Python Mongoengine: How to bypass documents which cannot pass validation to avoid crash 【发布时间】:2020-10-11 17:42:13 【问题描述】:

我正在使用 Mongoengine 将 .csv 文件中的数据保存到 MongoDB。

我将一个文档类定义为:

class Marc(Document):
    BibID = IntField(required=True)
    ISBN = StringField(required=True, max_length=13)
    Author = StringField(max_length=50)
    Title = StringField(required=True, max_length=200)
    Summary = StringField(max_length=2000)
    Genre = StringField(max_length=30)
    TopicalMain = ListField(StringField(max_length=80))
    TopicalGeographic = ListField(StringField(max_length=50))
    meta = 'allow_inheritance': True, 'strict': False

并一一创建文档记录:

def __createMarcRecord(self, rec):
    return NewDoc(
        BibID=rec['BibID'],
        ISBN=rec['ISBN'],
        Title=rec['Title'],
        Author=rec['Author'] if "Author" in rec else None,
        Summary=rec['Summary'] if "Summary" in rec else None,
        Genre=rec['Genre'] if "Genre" in rec else None,
        TopicalMain=rec['Topical_Main'] if "Topical_Main" in rec else None,
        TopicalGeographic=rec['Topical_Geographic'] if "Topical_Geographic" in rec else None,
        Stored=datetime.datetime.now()
    )

然后我尝试保存文档:

def storeToMongoDB(self):
    count = 0
    with open(self.errorLog, 'w') as ef:
        for i in self.bookList:
            count += 1
            print(count)
            marcRec = self.__createMarcRecord(i)
            try:
                marcRec.save()
            except:
                ef.write("0-1\n".format(count, sys.exc_info()[0]))
    ef.close()

.csv 文件中存在无法通过验证的条目(没有内容“标题”),因此代码会崩溃:

Traceback (most recent call last):
  File "/.../mongo.py", line 132, in storeToMongoDB
    marcRec = self.__createMarcRecord(i)
  File "/.../mongo.py", line 112, in __createMarcRecord
    Title=rec['Title'],
KeyError: 'Title'

请问有没有办法绕过这些文件避免崩溃?

【问题讨论】:

【参考方案1】:

乍一看,您似乎可以在第 112 行附近使用 try 和 except KeyError

try:
    marcRec = self.__createMarcRecord(i)
except KeyError:
    continue  # move onto next book

【讨论】:

是的,这是有效的。我的错,我没有检查错误消息,并认为错误来自 .save() 函数。非常感谢!

以上是关于Python Mongoengine:如何绕过无法通过验证的文档以避免崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用 MongoEngine 查询 MongoDB 中的特定文档?

Python中使用MongoEngine2

Python中使用MongoEngine3

Python中使用MongoEngine

python-flask 框架使用 flask_mongoengine

Python中使用MongoEngine1