当前位置: 首页 > 知识库问答 >
问题:

DynamoDB通过Boto3分页,NextToken不存在,但LastEvalue atedKey是?

狄鸿禧
2023-03-14

boto3和dynamodb分页器的文档指定在分页时应返回NextToken,然后在下一个StartingToken查询中包含该令牌以恢复分页会话(通过RESTful API访问信息时会发生这种情况)。

但是,我的测试表明,它不会在结果中返回NextToken,而是返回LastEvaluatedKey。我想我可以使用LastEvaluatedKey作为令牌,但这不起作用?

paginator = client.get_paginator('scan')
page_iterator = paginator.paginate(TableName='test1', PaginationConfig={'PageSize': 1 , 'MaxItems': 5000,  'MaxSize': 1 })

    for page in page_iterator:
        print(page)
        break   

我希望从page_迭代器返回的page对象包含NextToken键,但它没有?

{'Items': [{'PK': {'S': '99'}, 'SK': {'S': '99'}, 'data': {'S': 'Test Item 99'}}], 'Count': 1, 'ScannedCount': 1, 'LastEvaluatedKey': {'PK': {'S': '99'}, 'SK': {'S': '99'}}, 'ResponseMetadata': {'RequestId': 'DUE559L8KVKVH8H7G0G2JH0LUNVV4KQNSO5AEMVJF66Q9ASUAAJG', 'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'Server', 'date': 'Mon, 27 May 2019 14:22:09 GMT', 'content-type': 'application/x-amz-json-1.0', 'content-length': '153', 'connection': 'keep-alive', 'x-amzn-requestid': 'DUE559L8KVKVH8H7G0G2JH0LUNVV4KQNSO5AEMVJF66Q9ASUAAJG', 'x-amz-crc32': '3759060959'}, 'RetryAttempts': 0}}

我错过了什么?

更新:与此相关吗?如何使用Boto3分页

共有1个答案

谷梁昊空
2023-03-14

有几种方法可以使用boto3扫描分页器解决此问题。

第一个选项是这样调用build_full_result

result = paginator.paginate(TableName="your_table", PaginationConfig={"MaxItems":10, "PageSize": 10}).build_full_result()

返回包含10项的响应,如果有10项以上,则填充“NextToken”。这可能是最简单的方法,您可以将MaxItems视为返回的页面大小,如果“NextToken”为空,则扫描结束。

我注意到,如果不指定页面大小,结果是相同的,但消耗的容量和“ScannedCount”更高。

另一种方法是直接使用botocore.paginate中的TokenEncoder对StartingToken进行编码。

如果对分页器的初始调用是这样的:

pagination_config = {
    "MaxItems": 5000,
    "PageSize": 10,
}

scan_iterator = scan_paginator.paginate(
    TableName="your_table_name",
    PaginationConfig=pagination_config
)

分页结果将如问题所述。前10个结果将在第一页中返回,未指定“NextToken”,但指定了“LastEvaluatedKey”。

要使用它,请将返回的“LastEvaluatedKey”编码为“ExclusiveStartKey”,并将其作为分页配置中的“StartingToken”传入。

from botocore.paginate import TokenEncoder
encoder = TokenEncoder()
for page in scan_iterator:
    if "LastEvaluatedKey" in page:
            encoded_token = encoder.encode({"ExclusiveStartKey": page["LastEvaluatedKey"]})

然后:

pagination_config = {
    "MaxItems": 500,
    "PageSize": 10,
    "StartingToken": encoded_token
}

将主键编码为ExclusiveStartKey的原因是它是实际扫描API所期望的。本质上,分页器是编码/解码'LastEvalue atedKey'和'ExclusiveStartKey'到'NextToken'和'StartingToken'值。如果您对执行build_full_result时返回的'NextToken'执行Base64解码,您将看到它也使用了'ExclusiveStartKey'。

 类似资料:
  • 我们正在使用boto3为我们的DynamoDB,我们需要做一个完整的扫描我们的表,以便能够做到这一点,基于其他帖子,我们需要做一个分页。但是,我们无法找到分页的工作示例。这是我们所做的。 我们不知道如何将esk作为下一个查询的ExclusiveStartKey。ExclusiveStartkey参数的预期值应该是多少?我们在DynamoDB还是新手,还有很多东西需要学习,包括这个。谢谢

  • 这更像是一个概念澄清。我可以使用Boto3通过使用上一个响应的LastEvaluatedKey重复查询找到实际计数。 我想计算符合dynamoDb中特定条件的项目。我使用的是“select=count”,根据文档[1],它应该只返回匹配项的计数,并且我假设响应不会分页。 计数-返回匹配项的数量,而不是匹配项本身。 当我通过AWS-cli尝试时,我的假设似乎是正确的(就像文档[1]中的其他api样本

  • 背景: 默认情况下,列出IAM用户的AWS操作返回的最大值为50。 阅读下面的文档(链接),我运行下面的代码,并通过将“MaxItems”设置为1000返回完整的数据集。 http://boto3.readthedocs.io/en/latest/guide/paginators.html https://boto3.readthedocs.io/en/latest/reference/servi

  • 我已经通读了AWS关于分页的文档: 根据他们的文件规定: 在响应中,DynamoDB返回限制值范围内的所有匹配结果。例如,如果发出限制值为6且没有筛选器表达式的查询或扫描请求,DynamoDB将返回表中与请求中指定的键条件匹配的前六项(或者在没有筛选器的扫描情况下仅返回前六项) 这意味着,给定我有一个名为的表,其属性称为(可以接受从到的任何数值),我可能会遇到以下难题: 客户提出请求,思考

  • 我有一个终点 api响应看起来像 我正在尝试使用SpringV2在另一个微服务中使用该endpoint。5.0 via 的实现遵循这篇文章来处理分页响应。 然而,当运行我的应用程序时,我得到了这个错误 如何正确使用此终结点?

  • 这是一个正在使用AWS开发的项目。 我已经使用CloudWatch中的cron表达式安排了lambda函数。该函数将每天上传项目到DynamoDB。 尽管有一个唯一的主键,但有些项目没有上传到Dynamodb。有时跳过连续项,有时跳过主键稍相似的项。通常,跳过的项目数少于20个。 当我再次手动运行lambda函数时,它完全可以工作。想知道这背后的原因,可能的解决方案。谢谢!