AWS DynamoDB ExclusiveStartKey default value

Viewed 5076

I'm trying to make a query to DynamoDB, and if a LastEvaluatedKey is returned (meaning the query exceeds 1 MB) I want to make other queries in order to fetch all the required data from the table, using LastEvaluatedKey as ExclusiveStartKey for the next query. This is the code I have for now:

query_response = table.query(
    KeyConditionExpression=Key('brand').eq(brand)
)

pagination_key = None

if 'LastEvaluatedKey' in query_response:
    pagination_key = query_response['LastEvaluatedKey']

    while pagination_key:
        next_query_response = table.query(
            KeyConditionExpression=Key('brand').eq(brand),
            ExclusiveStartKey=pagination_key
        )

However, I'd like to refacto this code by extracting the query into a method, passing it pagination_key as an argument. To do this, I'd have to be able to either set ExclusiveStartKey to False, None or some other default value for the first call but I didn't find anything on this, or I'd have to be able to exclude the ExclusiveStartKey alltogether, but I don't know how to do this either.

2 Answers

Using keyword Arguments **kwargs it might look like this. Also, I am setting up the query before and only updating the ExclusiveStartKeyevery time.

query = { "KeyConditionExpression": Key('brand').eq(brand) }


ExclusiveStartKey = None
while True:
    if ExclusiveStartKey is not None:
        query['ExclusiveStartKey'] = ExclusiveStartKey
    query_response = table.query(**query)

    if 'LastEvaluatedKey' in query_response:
        ExclusiveStartKey = query_response['LastEvaluatedKey']
    else:
        break

I found an easy way of building the parameters:

query_params = { 'KeyConditionExpression': Key('brand').eq(brand) }

if pagination_key:
    query_params['ExclusiveStartKey'] = pagination_key

query_response = table.query(query_params)
Related