Home > front end >  Update record in DynamoDB for reserved Keyword
Update record in DynamoDB for reserved Keyword

Time:12-27

Following data mapped in DynamoDB for record_id 7, I want to update customer with new value

"customer": {
            "value": "id2",
            "label": "Customer2"
        }

However, dyanamoDB does not allow to update because of "ValidationException: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: value".

Record in DynamoDB:

{
    "terms": "Terms",
    "action": {
        "value": "id1",
        "label": "In Progress"
    },
    "line_items": [{
        "product": "dd",
        "quantity": "10",
    }],
    "_id": "7",
    "customer": {
        "value": "id1",
        "label": "Customer1"
    }
}


   updateExpression = "set "
   updateValues = dict()
   expression_attributes_names = {}

   for key, value in dictData.items():  
     key1 =  key.replace('.', '.#')
     updateExpression  =" #{key1} = :{key},"
     updateValues[f":{key}"] = value
     expression_attributes_names[f"#{key1}"] = key

   table.update_item(
   Key={
    'id': item_id
   },
   UpdateExpression=updateExpression,
   ExpressionAttributeValues=updateValues
   ExpressionAttributeNames=expression_attributes_names
   )

CodePudding user response:

UpdateExpression expects a string and you are passing a list:

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html#DDB-UpdateItem-request-UpdateExpression

I would also suggest you just print the values and check that they match the correct syntax expected for the parameters you're passing.

For nested values you just follow the same concept:

#customer.#value

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html#Expressions.ExpressionAttributeNames.NestedAttributes

CodePudding user response:

it will be easier for me if you share the query expression you tried but in case of reserved words you need to rename the field in the query:

table.update_item(
    Key={
        '_id': 7
    },
    UpdateExpression="set #val = :v",
    ExpressionAttributeValues={
        ":v": "false",
    },
    ExpressionAttributeNames={
      "#val": "value"
    }
)
  • Related