Quando uso uma operação de consulta ou verificação para buscar itens de uma tabela do Amazon DynamoDB, a resposta não retorna os resultados completos.
Resolução
Esse problema ocorre devido a essas duas condições:
- Sua operação inicial de consulta ou verificação contém LastEvaluatedKey na resposta.
- Você não usou essa chave como ExclusiveStartKey para a próxima solicitação para realizar uma operação subsequente.
Para resolver esse problema, implemente a paginação na sua tabela do DynamoDB. Paginação é o processo de enviar solicitações subsequentes para continuar quando uma solicitação anterior estiver incompleta. Uma operação de consulta ou verificação no DynamoDB pode retornar resultados incompletos e exigir solicitações subsequentes para obter o conjunto completo de resultados. Isso ocorre porque o DynamoDB pagina os resultados de uma operação de consulta ou verificação e retorna no máximo 1 MB de dados em uma única operação. O máximo de dados é um limite rígido no DynamoDB. Com a paginação, os resultados das operações de verificação e consulta são divididos em páginas de dados com 1 MB ou menos.
Para implementar a paginação no Amazon DynamoDB, use a funcionalidade de paginação integrada. Execute um comando semelhante a este exemplo:
use DynamoDB.Paginator.Query.paginate
client = boto3.client("dynamodb")
paginator = client.get_paginator("scan")
params = {}
for page in paginator.paginate(params):
# do something
Você também pode paginar seus resultados e recuperá-los uma página por vez. Para ver se o resultado contém o elemento LastEvaluatedKey, verifique o resultado de baixo nível de uma operação de verificação ou consulta. Para obter os resultados restantes, use outra operação de verificação ou consulta com os mesmos parâmetros. Para a segunda operação, use LastEvaluatedKey como o parâmetro ExclusiveStartKey. Se o resultado não incluir o valor LastEvaluatedKey, não haverá itens a serem recuperados.
Para obter mais informações, consulte Paginar resultados de consulta de tabela e Paginar resultados.
Para usar LastEvaluatedKey para implementar a paginação no Boto3, execute um comando semelhante a este exemplo:
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))