Разбивка запроса DynamoDB на страницы в boto3

Как перебрать все результаты запроса DynamoDB, если они охватывают более одной страницы? Этот ответ подразумевает, что нумерация страниц встроена в функцию запроса (по крайней мере, в v2), но когда я пробую это в v3, мои предметы кажутся ограниченными:

import boto3
from boto3.dynamodb.conditions import Key, Attr

dynamodb = boto3.resource('dynamodb')
fooTable = dynamodb.Table('Foo')
response = fooTable.query(
    KeyConditionExpression=Key('list_id').eq('123')
)

count = 0

for i in response['Items']:
    count += 1

print count # Prints a subset of my total items

person Jonathan    schedule 06.09.2016    source источник
comment
Это должно сработать. Попробуйте scan() всю таблицу, чтобы убедиться, что вы действительно должны получить больше предметов.   -  person joarleymoraes    schedule 06.09.2016
comment
Спасибо @joarleymoraes, но я попробовал именно это, и счетчик в консоли DynamoDB примерно в 10 раз больше, чем возвращает boto3.   -  person Jonathan    schedule 07.09.2016
comment
Является ли list_id строкой или целым числом? Может быть, вы хотите проверить это.   -  person joarleymoraes    schedule 24.09.2016
comment
Любая причина для использования for loop со счетчиком вместо print len(response['Items'])? BTW у меня такая же проблема, как у вас.   -  person João Abrantes    schedule 15.03.2018
comment
@JoãoAbrantes нет причин, это просто пример кода для того, чтобы задать вопрос :)   -  person Jonathan    schedule 15.03.2018


Ответы (1)


ExclusiveStartKey — это имя искомого атрибута. Используйте значение, которое было возвращено для LastEvaluatedKey в предыдущей операции.

Тип данных для ExclusiveStartKey должен быть String, Number или Binary. Запрещено использовать заданные типы данных.

http://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html#DynamoDB.Client.query

person omuthu    schedule 06.09.2016
comment
Вероятно, должно было быть более ясно - я знаю, что могу вручную разбить на страницы, используя ExclusiveStartKey. Но в связанном ответе @garnaat (автор boto!) сообщил, что он должен быть доступен из коробки в функции запроса. - person Jonathan; 07.09.2016
comment
@Jonathan Похоже, @garnaat может иметь в виду что-то другое. Документация в ответе здесь довольно явная. Вы получите максимум 1 МБ данных с каждым запросом, и вы, разработчик приложения, должны использовать ExclusiveStartKey, чтобы получить больше. - person The Unknown Dev; 21.04.2019