Я использую следующий код для запроса и разбивки на страницы через запрос DynamoDB:
class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return str(o)
return super(DecimalEncoder, self).default(o)
def run(date: int, start_epoch: int, end_epoch: int):
dynamodb = boto3.resource('dynamodb',
region_name='REGION',
config=Config(proxies={'https': 'PROXYIP'}))
table = dynamodb.Table('XYZ')
response = table.query(
# ProjectionExpression="#yr, title, info.genres, info.actors[0]", #THIS IS A SELECT STATEMENT
# ExpressionAttributeNames={"#yr": "year"}, #SELECT STATEMENT RENAME
KeyConditionExpression=Key('date').eq(date) & Key('uid').between(start_epoch, end_epoch)
)
for i in response[u'Items']:
print(json.dumps(i, cls=DecimalEncoder))
while 'LastEvaluatedKey' in response:
response = table.scan( ##IS THIS INEFFICIENT CODE?
# ProjectionExpression=pe,
# FilterExpression=fe,
# ExpressionAttributeNames=ean,
ExclusiveStartKey=response['LastEvaluatedKey']
)
for i in response['Items']:
print(json.dumps(i, cls=DecimalEncoder))
Хотя этот код работает, он невероятно медленный, и я боюсь, что результатом является * response = table.scan
. У меня сложилось впечатление, что запросы выполняются намного быстрее, чем запросы сканирования (поскольку сканирование требует полной итерации таблицы). Этот код вызывает полную итерацию таблицы базы данных?
Это может быть отдельный вопрос, но есть ли более эффективный способ (с примерами кода) сделать это? Я попытался использовать разбиение на страницы в Boto3, но не смог заставить его работать и с запросами.