使用Boto3扫描DynamoDB触发ValidationException错误求助
解决DynamoDB Scan操作的ValidationException错误
错误原因
你传入了ExpressionAttributeNames和ExpressionAttributeValues参数,但没有指定对应的表达式参数(比如FilterExpression)。DynamoDB要求这两个属性必须配合表达式使用,否则会触发验证错误。
修正方案
方案1:使用Boto3条件构造器(推荐,简洁易读)
利用Attr构造过滤表达式,Boto3会自动处理属性名和值的映射,无需手动指定ExpressionAttributeNames和ExpressionAttributeValues:
import boto3 import pprint from boto3.dynamodb.conditions import Attr dbresource = boto3.resource('dynamodb') def lambda_handler(event, context): tableobject = dbresource.Table('basicSongsTable') response = tableobject.scan( FilterExpression=Attr('artist').eq('Matt') ) pprint.pprint(response)
方案2:手动指定表达式参数(适合复杂场景)
如果需要用占位符处理保留字属性名,可手动搭配FilterExpression使用:
import boto3 import pprint dbresource = boto3.resource('dynamodb') def lambda_handler(event, context): tableobject = dbresource.Table('basicSongsTable') response = tableobject.scan( FilterExpression='#art = :artist_val', ExpressionAttributeNames={'#art': 'artist'}, ExpressionAttributeValues={':artist_val': 'Matt'} ) pprint.pprint(response)
额外提示
- 无需重复导入
pprint,可移除代码中重复的from pprint import pprint。 - 手动指定
ExpressionAttributeValues时,不需要像原代码那样用{'S': 'Matt'}强制定义类型,Boto3会根据Python类型自动转换为DynamoDB对应类型。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

