AWS Lambda使用Boto3操作DynamoDB时出现'Attr未定义'错误求助
解决Boto3中Attr未定义的NameError错误
错误原因
你代码里使用的Attr类属于boto3.dynamodb.conditions模块,但当前代码没有导入这个模块,导致Python找不到该名称,触发NameError。
修复步骤
- 导入Attr类
在代码的import区域添加一行:
from boto3.dynamodb.conditions import Attr
- 可选优化:利用环境变量增强灵活性
你代码里已经定义了keytofind = os.environ.get('FILTER'),可以把硬编码的'Receiver'替换为这个变量,让筛选条件可通过环境配置动态调整。
修改后的完整代码
import json import os import boto3 from pprint import pprint from boto3.dynamodb.conditions import Attr # 新增导入语句 # Find records that has agentRole as 'Receiver' tableName = os.environ.get('TABLE') fieldName = os.environ.get('FIELD') keytofind = os.environ.get('FILTER') fieldname = "agentRole" dbclient = boto3.resource('dynamodb') def lambda_handler(event, context): tableresource = dbclient.Table(tableName) count = tableresource.item_count # 可选:如果要使用环境变量的筛选值,替换为下面一行 # response = tableresource.scan(FilterExpression=Attr(fieldname).eq(keytofind)) response = tableresource.scan(FilterExpression=Attr('agentRole').eq('Receiver')) # 建议添加返回结果的逻辑,比如返回响应内容 return { 'statusCode': 200, 'body': json.dumps(response['Items']) }
额外说明
Attr是Boto3提供的条件构造器,用于构建DynamoDB的筛选/查询表达式,必须从boto3.dynamodb.conditions导入才能使用。- 如果你不需要硬编码字段名,也可以用代码里定义的
fieldname变量替换'agentRole',进一步提升代码可维护性。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

