How to append a value to list attribute on AWS DynamoDB? How to append a value to list attribute on AWS DynamoDB? python python

How to append a value to list attribute on AWS DynamoDB?


The following code should work with boto3:

table = get_dynamodb_resource().Table("table_name")result = table.update_item(    Key={        'hash_key': hash_key,        'range_key': range_key    },    UpdateExpression="SET some_attr = list_append(some_attr, :i)",    ExpressionAttributeValues={        ':i': [some_value],    },    ReturnValues="UPDATED_NEW")if result['ResponseMetadata']['HTTPStatusCode'] == 200 and 'Attributes' in result:    return result['Attributes']['some_attr']

The get_dynamodb_resource method here is just:

def get_dynamodb_resource():    return boto3.resource(            'dynamodb',            region_name=os.environ['AWS_DYNAMO_REGION'],            endpoint_url=os.environ['AWS_DYNAMO_ENDPOINT'],            aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'],            aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID'])


You can do this in 1 request by using the UpdateItem API in conjunction with an UpdateExpression. Since you want to append to a list, you would use the SET action with the list_append function:

SET supports the following functions:

...

  • list_append (operand, operand) - evaluates to a list with a new element added to it. You can append the new element to the start or the end of the list by reversing the order of the operands.

You can see a couple examples of this on the Modifying Items and Attributes with Update Expressions documentation:

  • The following example adds a new element to the FiveStar review list. The expression attribute name #pr is ProductReviews; the attribute value :r is a one-element list. If the list previously had two elements, [0] and [1], then the new element will be [2].

    SET #pr.FiveStar = list_append(#pr.FiveStar, :r)
  • The following example adds another element to the FiveStar review list, but this time the element will be appended to the start of the list at [0]. All of the other elements in the list will be shifted by one.

    SET #pr.FiveStar = list_append(:r, #pr.FiveStar)

The #pr and :r are using placeholders for the attribute names and values. You can see more information on those on the Using Placeholders for Attribute Names and Values documentation.