Wie implementiere ich Paginierung in Amazon DynamoDB?

Letzte Aktualisierung: 12.08.2022

Wenn ich versuche, Elemente aus einer Amazon-DynamoDB-Tabelle mithilfe eines Abfrage- oder Scanvorgangs abzurufen, gibt die Antwort nicht die vollständigen Ergebnisse zurück.

Auflösung

Dieses Problem tritt unter den folgenden Bedingungen auf:

  • Ihr erster Scan- oder Abfragevorgang enthält LastEvaluatedKey in der Antwort.
  • Sie haben keinen nachfolgenden Vorgang ausgeführt, indem Sie diesen Schlüssel als ExclusiveStartKey für die nächste Anforderung verwendet haben.

Sie können dieses Problem lösen, indem Sie die Paginierung für Ihre DynamoDB-Tabelle implementieren. Paginierung ist der Prozess, bei dem nachfolgende Anfragen gesendet werden, um fortzufahren, wenn eine vorherige Anfrage unvollständig ist. Ein Abfrage- oder Scanvorgang in DynamoDB gibt möglicherweise unvollständige Ergebnisse zurück und erfordert nachfolgende Anforderungen, um die gesamte Ergebnismenge zu erhalten. Dies liegt daran, dass DynamoDB die Ergebnisse eines Abfrage- oder Scanvorgangs paginiert und in einem einzigen Vorgang maximal 1 MB an Daten zurückgibt. Dies ist ein festes Limit in DynamoDB. Bei der Paginierung werden die Ergebnisse der Scan- und Abfragevorgänge in Datenseiten unterteilt, die 1 MB oder weniger groß sind.

Um Ihre Ergebnisse zu paginieren und sie seitenweise abzurufen, überprüfen Sie das Ergebnis auf niedriger Ebene eines Scan- oder Abfragevorgangs, um festzustellen, ob das Ergebnis das lastEvaluatedKey-Element enthält. Sie können die verbleibenden Ergebnisse der ersten Anforderung mit einem anderen Scan- oder Abfragevorgang mit denselben Parametern abrufen, jedoch unter Verwendung des LastEvaluatedKey-Werts als ExclusiveStartKey-Parameter. Wenn das Ergebnis den lastEvaluatedKey-Wert nicht enthält, müssen keine Elemente abgerufen werden.

Weitere Informationen finden Sie unter Paginieren von Tabellenabfrageergebnissen und Paginieren der Ergebnisse.

Verwenden Sie das folgende Codebeispiel, um die Paginierung in Boto3 mithilfe von LastEvaluatedKey zu implementieren:

from __future__ import print_function  # Python 2/3 compatibility
import boto3
from botocore.exceptions import ClientError

# Create Client
session = boto3.session.Session()
dynamoDbClient = session.client('dynamodb')

table_name = 'AmazonBins'

# Track number of Items read
item_count = 0

try:
    # Get the first 1MB of data
    response = dynamoDbClient.scan(
        TableName=table_name
    )

except ClientError as error:
    print("Something went wrong: ")
    print(error.response['ResponseMetadata'])

# Track number of Items read
item_count += len(response['Items'])

# Paginate returning up to 1MB of data for each iteration
while 'LastEvaluatedKey' in response:
    try:
        response = dynamoDbClient.scan(
            TableName=table_name,
            ExclusiveStartKey=response['LastEvaluatedKey']
        )
        # Track number of Items read
        item_count += len(response['Items'])

    except ClientError as error:
        print("Something went wrong: ")
        print(error.response['ResponseMetadata'])

print("Total number of items found: {}".format(item_count))

War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?