使用Boto3 DynamoDB Scan含Contains过滤器无结果问题排查
问题排查与解决
你的问题出在ExpressionAttributeValues的格式上。你使用的是Boto3的DynamoDB表资源(Table Resource)高层接口,它会自动推断数据类型,不需要像客户端(Client)接口那样显式指定类型标记(比如{'S': search})。
修正后的代码如下:
search = "SomeProductText" response = table.scan( FilterExpression='contains(product_text, :pt)', ExpressionAttributeValues={ ':pt': search # 直接传字符串,无需类型标记 } ) print(response['Items']) while 'LastEvaluatedKey' in response: response = table.scan( ExclusiveStartKey=response['LastEvaluatedKey'], FilterExpression='contains(product_text, :pt)', ExpressionAttributeValues={ ':pt': search } ) print(response['Items'])
原因说明
表资源的scan方法属于Boto3的高层封装,会根据传入的值自动映射到DynamoDB的对应数据类型(比如字符串会自动处理为S类型)。你之前的写法是客户端接口的格式,用在资源接口里会让DynamoDB把{'S': 'SomeProductText'}当成嵌套结构去匹配,自然无法找到对应的数据条目。
内容的提问来源于stack exchange,提问作者The amateur programmer
相关产品推荐
相关产品推荐

