为分页Boto3 DynamoDB Scan添加过滤表达式遇问题求助
问题解决:DynamoDB分页扫描添加过滤条件
一、分页器Scan过滤条件报错的原因及修复
你使用的是boto3.client的分页器,而Attr()是boto3.resource专属的条件构造语法,client端的API要求FilterExpression必须是字符串格式,同时需要配合ExpressionAttributeValues传递变量值,不能直接传入resource的条件对象。
方案1:直接写字符串格式的过滤表达式
import boto3 dynamodb = boto3.client('dynamodb') dynamores = boto3.resource('dynamodb') table = dynamores.Table('table') pagination_config = {"MaxItems": 2, "PageSize": 2} paginator = dynamodb.get_paginator('scan') response_iterator = paginator.paginate( TableName=table.table_name, PaginationConfig=pagination_config, FilterExpression="contains(Email, :user) AND contains(Category, :types)", ExpressionAttributeValues={ ":user": {"S": user}, # S代表字符串类型,根据字段实际类型调整:N=数字,BOOL=布尔 ":types": {"S": types} } ) # 遍历分页结果 for page in response_iterator: print(page['Items'])
方案2:用Attr()构造后转成client兼容格式
如果习惯用Attr()语法,可以通过build_expression()方法把条件对象转换成client需要的参数:
import boto3 from boto3.dynamodb.conditions import Attr dynamodb = boto3.client('dynamodb') dynamores = boto3.resource('dynamodb') table = dynamores.Table('table') pagination_config = {"MaxItems": 2, "PageSize": 2} # 用Attr构造条件 condition = Attr("Email").contains(user) & Attr("Category").contains(types) # 转换为client兼容的表达式和参数 expr = condition.build_expression() response_iterator = paginator.paginate( TableName=table.table_name, PaginationConfig=pagination_config, FilterExpression=expr['FilterExpression'], ExpressionAttributeValues=expr['ExpressionAttributeValues'] )
二、JMES搜索无结果的修复
你的JMES路径写错了:DynamoDB scan分页返回的结果中,数据存储在Items字段下,而非Contents;同时client返回的字段会带类型标识(比如字符串字段是字段名.S),正确写法如下:
response_iterator = paginator.paginate( TableName=table.table_name, PaginationConfig=pagination_config ) # 修正JMES路径,注意字段的类型后缀 filtered_iterator = response_iterator.search("Items[?contains(Category.S, 'File Status')]") # 遍历过滤后的结果 for item in filtered_iterator: print(item)
三、关于operation_parameters参数
分页器的paginate()方法不需要通过operation_parameters传递过滤条件,直接将FilterExpression、ExpressionAttributeValues等参数写在方法参数中即可,operation_parameters多用于传递特殊场景的额外操作参数。
内容的提问来源于stack exchange,提问作者RAH
相关产品推荐
相关产品推荐

