Python 3.6中find_one方法返回KeyError问题求助
我来帮你捋捋这个问题——你已经确认MongoDB里存在目标文档,但代码还是抛出了KeyError: 'email',咱们一步步排查可能的原因:
先确认查询返回的
data到底是什么
有时候自定义的Database封装类可能会做一些额外处理,比如默认过滤掉某些字段,或者返回的结构和你预期的不一样。建议你在查询语句后面加个打印,看看实际拿到的数据:data = Database.find_one("users", {'email': email}) print("查询返回的原始数据:", data) # 加这行打印 if data is not None: return cls(**data)直接看
data里有没有'email'这个键,这是最快定位问题的方式。检查类的
__init__方法参数是否匹配
当你用cls(**data)实例化对象时,如果你的类的构造方法(__init__)没有声明email作为参数,或者参数名和MongoDB里的字段名不匹配(比如写成了email_addr),解包的时候就会找不到对应的键,抛出KeyError。仔细核对下类的初始化方法,确保参数列表包含email,且名字完全一致。警惕字段名的大小写问题
MongoDB的字段名是区分大小写的!虽然你在MongoDB shell里看到的是email,但要确认代码里的查询条件、以及类的参数有没有写成Email或者eMail这类变体,这种细微的拼写错误很容易被忽略。排查是否存在默认投影设置
有些MongoDB封装库或者自定义的Database类,可能会默认设置投影(projection),只返回部分字段。比如如果find_one默认只返回_id和password,那email字段自然不会在data里。你可以手动指定投影强制返回所有需要的字段:# 显式指定要返回的字段,确保email被包含 data = Database.find_one("users", {'email': email}, projection={'_id': 1, 'email': 1, 'password': 1})如果你的封装支持,也可以用
projection=None来取消默认的投影规则。
先从打印data开始排查吧,这一步能直接帮你确定问题是出在查询环节,还是实例化环节。
内容的提问来源于stack exchange,提问作者maverick029

