使用Boto3调用DynamoDB Query时IN运算符报错问题求助
DynamoDB使用IN运算符查询报错的解决方案
错误原因
DynamoDB的Query操作对主键约束有严格限制:
- 针对分区键的条件只能用精确匹配(
=),IN运算符不被KeyConditions支持 KeyConditions仅允许对排序键使用IN,且必须先指定分区键的精确值
你当前把IN用在分区键的约束上,触发了ValidationException错误。
可行解决方案
方案1:用BatchGetItem批量获取(推荐)
如果col1是表的分区键,BatchGetItem是官方推荐的批量获取方式,性能远优于全表扫描,能一次性获取多个主键对应的记录。
代码示例:
import boto3 # 初始化DynamoDB客户端 dynamodb = boto3.client('dynamodb') table_name = 'tb' # 批量获取指定主键的记录 response = dynamodb.batch_get_item( RequestItems={ table_name: { 'Keys': [ {'col1': {'S': 'abc'}}, {'col1': {'S': 'def'}} ], 'ProjectionExpression': 'col1, col2, col3, col4' } } ) # 输出结果 print(response['Responses'][table_name])
方案2:用Scan配合FilterExpression(小数据量可用)
如果col1不是主键,或无法使用BatchGetItem,可以用Scan全表扫描后通过FilterExpression过滤结果。注意:Scan会遍历全表,数据量大时性能极差,消耗大量读写容量,不推荐用于生产环境大数据量场景。
代码示例:
import boto3 dynamodb = boto3.client('dynamodb') table_name = 'tb' # 扫描并过滤符合条件的记录 response = dynamodb.scan( TableName=table_name, Select='SPECIFIC_ATTRIBUTES', AttributesToGet=['col1', 'col2', 'col3', 'col4'], FilterExpression='col1 IN (:val1, :val2)', ExpressionAttributeValues={ ':val1': {'S': 'abc'}, ':val2': {'S': 'def'} } ) print(response['Items'])
特殊情况:col1是排序键
如果col1是表的排序键,你需要先指定分区键的精确值,再对排序键使用IN约束,示例代码:
import boto3 dynamodb = boto3.client('dynamodb') table_name = 'tb' response = dynamodb.query( TableName=table_name, Select='SPECIFIC_ATTRIBUTES', AttributesToGet=['col1', 'col2', 'col3', 'col4'], KeyConditions={ 'your_partition_key': { # 替换为你的分区键名称 'AttributeValueList': [{'S': 'fixed_partition_value'}], 'ComparisonOperator': 'EQ' }, 'col1': { 'AttributeValueList': [{'S': 'abc'}, {'S': 'def'}], 'ComparisonOperator': 'IN' } } ) print(response['Items'])
内容的提问来源于stack exchange,提问作者Teo
相关产品推荐
相关产品推荐

