从DynamoDb查询的Python脚本未提供所有项目

时间:2018-08-03 21:49:09

标签: amazon-web-services amazon-dynamodb

我已经编写了以下python代码以从表中获取数据,但未按我的要求获取所有项目。当我检查DynamoDb的AWS控制台页面时,与从脚本中获得的条目相比,可以看到更多的条目。

from __future__ import print_function # Python 2/3 compatibility
import boto3
import json
import decimal
from datetime import datetime
from boto3.dynamodb.conditions import Key, Attr
import sys

# Helper class to convert a DynamoDB item to JSON.
class DecimalEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            if o % 1 > 0:
                return float(o)
            else:
                return int(o)
        return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource('dynamodb', aws_access_key_id = '',
        aws_secret_access_key = '',
        region_name='eu-west-1', endpoint_url="http://dynamodb.eu-west-1.amazonaws.com")

mplaceId = int(sys.argv[1])
table = dynamodb.Table('XYZ')

response = table.query(
    KeyConditionExpression=Key('mplaceId').eq(mplaceId)
)

print('Number of entries found ', len(response['Items']))

我也在aws控制台上做了同样的事情。通过mplaceId查询。

它为什么会发生?

1 个答案:

答案 0 :(得分:2)

dynamodb.Table.query()返回最大1MB的数据。来自boto3 documentation

  

单个Query操作将最多读取设置的最大项目数(如果使用Limit参数)或最多1 MB的数据,然后使用{ {1}}。如果响应中包含FilterExpression,则需要对结果集进行分页。有关更多信息,请参阅《 Amazon DynamoDB开发人员指南》中的Paginating the Results

这实际上不是LastEvaluatedKey的限制,而是基础boto3-API的限制。

您可以使用query的{​​{3}}来代替自己实现分页。这是一个显示boto3提供的built-in pagination 用法的示例:

boto3