Comment mettre en œuvre la pagination dans Amazon DynamoDB ?

Dernière mise à jour : 12/08/2022

Lorsque j'essaie de récupérer des éléments d'une table Amazon DynamoDB à l'aide d'une opération de requête ou d'analyse, la réponse ne renvoie pas les résultats complets.

Solution

Ce problème se produit dans les conditions suivantes :

  • Votre opération initiale de requête ou d'analyse contient l'élément LastEvaluatedKey dans la réponse.
  • Vous n'avez pas effectué d'opération ultérieure en utilisant cette clé comme ExclusiveStartKey pour la demande suivante.

Vous pouvez corriger ce problème en mettant en œuvre la pagination de votre table DynamoDB. La pagination est le processus qui consiste à envoyer des demandes ultérieures pour continuer lorsqu'une demande précédente est incomplète. Une opération de requête ou d'analyse dans DynamoDB peut renvoyer des résultats incomplets et nécessiter des requêtes ultérieures pour atteindre l'ensemble de résultats complet. En effet, DynamoDB pagine les résultats d'une opération de requête ou d'analyse et renvoie un maximum de 1 Mo de données en une seule opération. Il s'agit d'une limite stricte dans DynamoDB. Avec la pagination, les résultats des opérations de requête et d'analyse sont divisés en pages de données d'une taille inférieure ou égale à 1 Mo.

Pour paginer vos résultats et les récupérer page par page, vérifiez le résultat de niveau inférieur d'une opération d'analyse ou de requête pour voir s'il contient l'élément LastEvaluatedKey. Vous pouvez obtenir les résultats restants de la demande initiale en utilisant une autre opération d'analyse ou de requête avec les mêmes paramètres, mais en utilisant la valeur LastEvaluatedKey comme paramètre ExclusiveStartKey. Si le résultat n'inclut pas la valeur LastEvaluatedKey, il n'y a aucun élément à récupérer.

Pour plus d'informations, veuillez consulter les rubriques Pagination des résultats d'une requête de table et Pagination des résultats.

Pour implémenter la pagination dans Boto3 à l'aide de LastEvaluatedKey, utilisez l'exemple de code suivant :

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))

Cet article vous a-t-il été utile ?


Avez-vous besoin d'aide pour une question technique ou de facturation ?