DynamoDB с boto3 - лимит действует как размер страницы - PullRequest
0 голосов
/ 05 июня 2019

Согласно boto3 документам , аргумент limit в query позволяет вам ограничивать количество оцененных объектов в вашей таблице DynamoDB / GSI.

Однако LastEvaluatedKey не возвращается при достижении желаемого предела, и поэтому клиент, который хотел бы ограничить количество полученных результатов, не сможет это сделать,

рассмотрит следующий код:

        while True:
            query_result = self._dynamodb_client.query(**query_kwargs)
            for dynamodb_formatted_item in query_result["Items"]:
                yield self._convert_dict_from_dynamodb_key_names(
                    from_dynamodb_formatted_dict_to_dict(dynamodb_formatted_item)
                )

            if "LastEvaluatedKey" not in query_result:
                return

Я что-то здесь упускаю?Это ошибка в библиотеке Boto?

1 Ответ

0 голосов
/ 06 июня 2019

В вашем примере кода отсутствует критическая часть, где LastEvaluatedKey возвращается в запрос как параметр ExclusiveStartKey!Таким образом, вы повторяете тот же запрос в цикле, а не продолжаете, когда предыдущий запрос остановлен.

Например, вот рабочий код (я сгенерировал массив, это не крутой генератор, как вы сделали ;-)):

def full_query(table, **kwargs):
    response = table.query(**kwargs)
    items = response['Items']
    while 'LastEvaluatedKey' in response:
        response = table.query(ExclusiveStartKey=response['LastEvaluatedKey'], **kwards)
        items.extend(response['Items'])
    return items

Теперь вы можете запустить

full_query(Limit=37, KeyConditions={...})

и получить все результаты, полученные партиями по 37.

...