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

使用Boto3的DynamoDB分页

邹山
2023-03-14

我们正在使用boto3为我们的DynamoDB,我们需要做一个完整的扫描我们的表,以便能够做到这一点,基于其他帖子,我们需要做一个分页。但是,我们无法找到分页的工作示例。这是我们所做的。

import boto3
client_setting = boto3.client('dynamodb', region_name='ap-southeast-2')
paginator = client_setting.get_paginator('scan')
esk = {}
data = []
unconverted_ga = ourQuery(params1, params2)
    for page in unconverted_ga:
        data.append(page)
        esk = page['LastEvaluatedKey']

我们不知道如何将esk作为下一个查询的ExclusiveStartKey。ExclusiveStartkey参数的预期值应该是多少?我们在DynamoDB还是新手,还有很多东西需要学习,包括这个。谢谢

共有3个答案

冯宪
2023-03-14

您可以尝试使用以下代码:

esk = None

while True:
    scan_generator = YourTableName.scan(max_results=10, exclusive_start_key=esk)
    for item in scan_generator:
        # your code for processing
    # condition to check if entire table is scanned 
    else:
        break;

    # Load the last keys
    esk = scan_generator.kwargs['exclusive_start_key'].values()

这里是参考文档链接。

希望这能有所帮助

苏星宇
2023-03-14

经过一个小时的搜索,我终于找到了一个更好的解决方案。对于那些刚接触DynamoDB的人,我们不应该错过这一点-http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.04.html

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

# 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', region_name='us-west-2', endpoint_url="http://localhost:8000")

table = dynamodb.Table('Movies')

fe = Key('year').between(1950, 1959)
pe = "#yr, title, info.rating"
# Expression Attribute Names for Projection Expression only.
ean = { "#yr": "year", }
esk = None


response = table.scan(
    FilterExpression=fe,
    ProjectionExpression=pe,
    ExpressionAttributeNames=ean
    )

for i in response['Items']:
    print(json.dumps(i, cls=DecimalEncoder))

// As long as LastEvaluatedKey is in response it means there are still items from the query related to the data
while 'LastEvaluatedKey' in response:
    response = table.scan(
        ProjectionExpression=pe,
        FilterExpression=fe,
        ExpressionAttributeNames= ean,
        ExclusiveStartKey=response['LastEvaluatedKey']
        )

    for i in response['Items']:
        print(json.dumps(i, cls=DecimalEncoder))
师冥夜
2023-03-14

根据Tay B在https://stackoverflow.com/a/38619425/3176550

import boto3
dynamodb = boto3.resource('dynamodb',
                          aws_session_token=aws_session_token,
                          aws_access_key_id=aws_access_key_id,
                          aws_secret_access_key=aws_secret_access_key,
                          region_name=region
)

table = dynamodb.Table('widgetsTableName')

response = table.scan()
data = response['Items']

while 'LastEvaluatedKey' in response:
    response = table.scan(ExclusiveStartKey=response['LastEvaluatedKey'])
    data.update(response['Items'])
 类似资料:
  • 是否有任何方法可以使用Boto3(Python库)执行ACID事务? 我想将一项写入多个表,并确保写入操作已应用于所有表,否则将回滚。我阅读了Boto3文档,没有看到任何关于事务或ACID操作的内容。 我查了这个图书馆:http://dynamodb-mapper.readthedocs.io/en/latest/ 我已经签出了代码,它似乎正在使用旧的boto库,而且似乎不再受支持。 我知道有一个

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

  • 我试图使用boto3创建一个Dynamodb表。但我得到以下错误: "botocore.exceptions.ClientError:调用CreateTable操作时出错(ValidationExcture):无效的KeySchema:第一个KeySchemaElement不是HASH键类型" 更多信息:我的帐户中没有任何全局表。 我试过的代码:

  • 我目前正在使用JS AWS-SDK的executeStatement使用PartiQL在DynamoDB中进行分页,但我返回的对象不包含用于分页的NextToken(仅项目数组)。这就是代码的样子(非常简单): 我想知道是否有人使用DynamoDB的PartiQL处理分页。 这可能是因为我的分区键是字符串类型吗? 还在努力弄清楚。 谢谢,提前!

  • 有人知道从表中分页记录吗。实际上,我想用DynamoDb在php中创建一个分页组件。 它似乎是不可能给分页喜欢 因为Dyanmodb只提供了LIMIT子句,通过它我们可以读取一定数量的记录,并且可以通过LastEvaluatedKey处理接下来的n条记录。所以如果我想直接跳到第五页,怎么可能呢? 据我所知,我们不能在页码中显示页码。我们可以做的就是读取一定数量的记录,并提供下一个链接来检索下一个n

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