Comment implémenter la pagination dans Amazon DynamoDB ?

Lecture de 3 minute(s)
0

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

Résolution

Ce problème se produit en raison des deux conditions suivantes :

  • Votre opération de requête ou d'analyse initiale contient LastEvaluatedKey dans la réponse.
  • Vous n'avez pas utilisé cette clé comme ExclusiveStartKey pour la demande suivante afin d'effectuer une opération ultérieure.

Pour résoudre ce problème, implémentez la pagination pour 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 obtenir l'ensemble de résultats. Cela est dû au fait que DynamoDB pagine les résultats d'une opération de requête ou d'analyse et renvoie au maximum 1 Mo de données en une seule opération. Le maximum de données est une limite stricte dans DynamoDB. Avec la pagination, les résultats des opérations d'analyse et de requête sont divisés en pages de données de 1 Mo ou moins.

Pour implémenter la pagination dans Amazon DynamoDB, utilisez la fonctionnalité de pagination intégrée. Exécutez une commande similaire à cet exemple :

use DynamoDB.Paginator.Query.paginate

client = boto3.client("dynamodb")
paginator = client.get_paginator("scan")
params = {}

for page in paginator.paginate(params):
# do something

Vous pouvez également paginer vos résultats et les récupérer page par page. Pour voir si le résultat contient l'élément LastEvaluatedKey, vérifiez le résultat de niveau inférieur d'une opération d'analyse ou de requête. Pour obtenir les résultats restants, utilisez une autre opération d'analyse ou de requête avec les mêmes paramètres. Pour la deuxième opération, utilisez 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, voir Pagination des résultats de requête de table et Pagination des résultats.

Pour utiliser LastEvaluatedKey afin d'implémenter la pagination dans Boto3, exécutez une commande similaire à cet exemple :

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))
AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 8 mois