Сканирование Dynamodb останавливается, и результаты возвращаются с помощью LastEvaluatedKey - PullRequest
0 голосов
/ 11 октября 2018

У меня есть конечная точка http - когда я получаю конечную точку с именем таблицы в качестве параметра строки запроса - я получаю только частичные результаты с LastEvaluatedKey

import boto3
import json

print('Loading function')
dynamo = boto3.client('dynamodb')


def respond(err, res=None):
    return {
        'statusCode': '400' if err else '200',
        'body': err.message if err else json.dumps(res),
        'headers': {
            'Content-Type': 'application/json',
        },
    }


def lambda_handler(event, context):

    operations = {
        'DELETE': lambda dynamo, x: dynamo.delete_item(**x),
        'GET': lambda dynamo, x: dynamo.scan(**x),
        'POST': lambda dynamo, x: dynamo.put_item(**x),
        'PUT': lambda dynamo, x: dynamo.update_item(**x),
    }

    operation = event['httpMethod']
    if operation in operations:
        payload = event['queryStringParameters'] if operation == 'GET' else json.loads(event['body'])
        return respond(None, operations[operation](dynamo, payload))
    else:
        return respond(ValueError('Unsupported method "{}"'.format(operation)))

Как проверитьвсе страницы таблицы.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018
import boto3
import json
import re

def lambda_handler(event, context):
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('master')

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

    while 'LastEvaluatedKey' in response:
        response = table.scan(ExclusiveStartKey=response['LastEvaluatedKey'])
        data.extend(response['Items'])

    return {
        'statusCode': 200,
        'headers': {
            'Access-Control-Allow-Origin' : '*',
        },
        'body': json.dumps(data)
    }
0 голосов
/ 11 октября 2018

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html

Если общее количество сканированных элементов превышает максимальный размер набора данных, равный 1 МБ, сканирование останавливается, и результаты возвращаются пользователю в виде значения LastEvaluatedKey для продолжениясканирование в последующей операции.Результаты также включают количество предметов, превышающих лимит.Сканирование может привести к тому, что никакие данные таблицы не будут соответствовать критериям фильтра.

Вам необходимо запросить, указав LastEvaluatedKey.

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

Тип данных для ExclusiveStartKey должен быть String, Number или Binary.Заданные типы данных не допускаются.

При параллельном сканировании в запросе на сканирование, включающем ExclusiveStartKey, должен быть указан тот же сегмент, предыдущее сканирование которого вернуло соответствующее значение LastEvaluatedKey.

Тип: String to AttributeValueкарта объектов

Ограничения длины ключа: максимальная длина 65535.

Обязательно: Нет

Пример кода цикла и проверки из https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Python.04.html#GettingStarted.Python.04.Scan:

while 'LastEvaluatedKey' in response:
    response = table.scan(
        ProjectionExpression=pe,
        FilterExpression=fe,
        ExpressionAttributeNames= ean,
        ExclusiveStartKey=response['LastEvaluatedKey']
        )
...