Есть несколько способов решить эту проблему, используя сканер boto3.
Первый вариант - вызвать build_full_result
примерно так:
result = paginator.paginate(TableName="your_table", PaginationConfig={"MaxItems":10, "PageSize": 10}).build_full_result()
, который возвращает ответ с 10элементы, и «NextToken» заполняется при условии, что есть более 10 элементов.Это, вероятно, самый простой способ, вы можете просто воспринимать MaxItems как размер возвращаемой страницы, и если «NextToken» пуст, вы находитесь в конце сканирования.
Я заметил, что если вы не укажете размер страницы, результаты будут такими же, но потребляемая емкость и ScannedCount будут выше.
Другим способом является кодирование 'StartingToken' с использованием TokenEncoder в botocore.paginate напрямую.
Если первоначальный вызов paginator выглядит следующим образом:
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 сканирования .По сути, пагинаторы кодируют / декодируют «LastEvaluatedKey» и «ExclusiveStartKey» в значения «NextToken» и «StartingToken».Если вы выполните декодирование base64 для «NextToken», возвращаемого при выполнении build_full_result
, вы увидите, что оно также использует «ExclusiveStartKey».