DynamoDB中Item不存在时如何修复KeyError错误?
解决DynamoDB查询无用户时返回指定信息的问题
先梳理你代码里的问题,再给出修复方案:
原代码存在的问题
- 缩进错误:
table = ddb.Table("TABLE_X")这行缩进层级错误,需和上一行ddb = session.resource(...)保持同级 - 变量不匹配:查询Key里用了
user,但函数参数是name,应该改成{"employee": name} - 逻辑冗余:
for item in data.items()完全没必要——get_item是按主键查询,查到的结果就是唯一的目标数据,循环反而会打乱逻辑 - KeyError根源:当用户不存在时,
response里没有"Item"字段,直接取response["Item"]会触发错误
修复后的代码(推荐方式)
def func(name): ddb = session.resource(service_name="dynamodb") table = ddb.Table("TABLE_X") # 用get方法获取Item,不存在则返回None,避免KeyError response = table.get_item(Key={"employee": name}) data = response.get("Item") if data: # 主键查询结果必然对应目标用户,无需额外判断 return name, data["manager"] # 用户不存在时返回指定信息 return "no user found"
另一种方式:捕获KeyError异常
如果你更倾向于用异常捕获处理,也可以这么写:
def func(name): ddb = session.resource(service_name="dynamodb") table = ddb.Table("TABLE_X") response = table.get_item(Key={"employee": name}) try: data = response["Item"] return name, data["manager"] except KeyError: return "no user found"
补充说明
你的DynamoDB表用employee作为主键,get_item查询时如果主键不存在,就不会返回Item字段,所以用response.get("Item")能安全获取数据,不存在时会得到None;原代码里的循环和if data["employee"] == name判断完全多余,因为主键查询的结果必然和你传入的name对应。
内容的提问来源于stack exchange,提问作者jenc
相关产品推荐
相关产品推荐

