Quando utilizzo un'operazione di esecuzione di una query o scansione per recuperare elementi da una tabella Amazon DynamoDB, la risposta non restituisce i risultati completi.
Risoluzione
Questo problema si verifica a causa di queste due condizioni:
- L'operazione iniziale di esecuzione di una query o scansione contiene LastEvaluatedKey nella risposta.
- Non hai usato questa chiave come ExclusiveStartKey per la richiesta successiva di esecuzione di un'operazione successiva.
Per risolvere questo problema, implementa la paginazione per la tua tabella DynamoDB. La paginazione è il processo di invio di richieste successive per continuare quando una richiesta precedente è incompleta. Un'operazione di esecuzione di una query o scansione in DynamoDB potrebbe restituire risultati incompleti e richiedere richieste successive per ottenere l'intero set di risultati. Ciò è dovuto al fatto che DynamoDB impagina i risultati di un'operazione di esecuzione di una query o scansione e restituisce un massimo di 1 MB di dati in una singola operazione. Il numero massimo di dati è un limite fisso in DynamoDB. Con la paginazione, i risultati delle operazioni di scansione ed esecuzione di una query vengono suddivisi in pagine di dati di dimensioni pari o inferiori a 1 MB.
Per implementare la paginazione in Amazon DynamoDB, utilizza la funzionalità di paginazione integrata. Esegui un comando simile a questo esempio:
use DynamoDB.Paginator.Query.paginate
client = boto3.client("dynamodb")
paginator = client.get_paginator("scan")
params = {}
for page in paginator.paginate(params):
# do something
È possibile anche paginare i risultati e recuperarli una pagina alla volta. Per verificare se il risultato contiene l'elemento LastEvaluatedKey, controlla il risultato di basso livello di un'operazione di scansione o esecuzione di una query. Per ottenere i risultati rimanenti, utilizzare un'altra operazione di scansione o esecuzione di una query con gli stessi parametri. Per la seconda operazione, utilizzare LastEvaluatedKey come parametro ExclusiveStartKey. Se il risultato non include il valore LastEvaluatedKey, non vi sono elementi da recuperare.
Per ulteriori informazioni, vedere Paginazione dei risultati delle esecuzioni di query nelle tabelle e Paginazione dei risultati.
Per utilizzare LastEvaluatedKey per implementare la paginazione in Boto3, esegui un comando simile a questo esempio:
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))