Example of update_item in dynamodb boto3 Example of update_item in dynamodb boto3 python python

Example of update_item in dynamodb boto3


Found working example here, very important to list as Keys all the indexes of the table, this will require additional query before update, but it works.

response = table.update_item(    Key={        'ReleaseNumber': releaseNumber,        'Timestamp': result[0]['Timestamp']    },    UpdateExpression="set Sanity = :r",    ExpressionAttributeValues={        ':r': 'false',    },    ReturnValues="UPDATED_NEW")


Details on dynamodb updates using boto3 seem incredibly sparse online, so I'm hoping these alternative solutions are useful.

get / put

import boto3table = boto3.resource('dynamodb').Table('my_table')# get itemresponse = table.get_item(Key={'pkey': 'asdf12345'})item = response['Item']# updateitem['status'] = 'complete'# put (idempotent)table.put_item(Item=item)

actual update

import boto3table = boto3.resource('dynamodb').Table('my_table')table.update_item(    Key={'pkey': 'asdf12345'},    AttributeUpdates={        'status': 'complete',    },)


The original code example:

response = table.update_item(    Key={'ReleaseNumber': '1.0.179'},    UpdateExpression='SET',    ConditionExpression='Attr(\'ReleaseNumber\').eq(\'1.0.179\')',    ExpressionAttributeNames={'attr1': 'val1'},    ExpressionAttributeValues={'val1': 'false'})

Fixed:

response = table.update_item(    Key={'ReleaseNumber': '1.0.179'},    UpdateExpression='SET #attr1 = :val1',    ConditionExpression=Attr('ReleaseNumber').eq('1.0.179'),    ExpressionAttributeNames={'#attr1': 'val1'},    ExpressionAttributeValues={':val1': 'false'})

In the marked answer it was also revealed that there is a Range Key so that should also be included in the Key. The update_item method must seek to the exact record to be updated, there's no batch updates, and you can't update a range of values filtered to a condition to get to a single record. The ConditionExpression is there to be useful to make updates idempotent; i.e. don't update the value if it is already that value. It's not like a sql where clause.

Regarding the specific error seen.

ExpressionAttributeNames is a list of key placeholders for use in the UpdateExpression, useful if the key is a reserved word.

From the docs, "An expression attribute name must begin with a #, and be followed by one or more alphanumeric characters". The error is because the code hasn't used an ExpressionAttributeName that starts with a # and also not used it in the UpdateExpression.

ExpressionAttributeValues are placeholders for the values you want to update to, and they must start with :