简体   繁体   中英

Removing the "reserved keyword" from dynamodb update item node js

I am able to SET values for reserved keywords but not able to remove certain keywords in dynamodb. My expression is below. Not able to remove data if I give like this. But able to remove size though.

Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword:data

{
  ConditionExpression: "#id = :id",
  ExpressionAttributeNames: {
    "#id": "id",
    “#name": “name",
 },
 ExpressionAttributeValues: {
    ":id": “1234566",
    “:name": “John",
 },
  Key: {
     id: "1234566",
  },
  ReturnValues: "ALL_NEW",
  TableName: “table_name",
  UpdateExpression: "SET #name = :name REMOVE size, data",
}

Modified to include data in expression attribute names as below. Still throws error.

{
  ConditionExpression: "#id = :id",
  ExpressionAttributeNames: {
    "#id": "id",
    “#name": “name",
    “#size": “size",
    “#data": “data",
},
  ExpressionAttributeValues: {
     ":id": “1234566",
    “:name": “John",
   “:size": undefined,
   “:data": undefined,
 },
  Key: {
   id: "1234566",
  },
  ReturnValues: "ALL_NEW",
  TableName: "table_name",
  UpdateExpression: "SET #name = :name, #size = :size, #data = 
    :data REMOVE size, data”,
  }

Remove size and data from ExpressionAttributeValues and from SET UpdateExpression. Add #size and #data to REMOVE on UpdateExpression instead of size and data.

{
    ConditionExpression: "#id = :id",
    ExpressionAttributeNames: {
       "#id": "id",
       “#name": “name",
       “#size": “size",
       “#data": “data",
     },
    ExpressionAttributeValues: {
       ":id": “1234566",
       “:name": “John"
    },
   Key: {
     id: "1234566",
   },
   ReturnValues: "ALL_NEW",
   TableName: "table_name",
   UpdateExpression: "SET #name = :name, REMOVE #size, #data”,
}

Reserved words in DynamoDB to do that dynamically you need only to provide a json object with this function it's create dynamically -ExpressionAttributeNames -ExpressionAttributeValues -UpdateExpression also skip reserved keyword for dynamodb

def generate_update_att(body):
    """
    #############input
    body={
    'newval':newData['newval'],
    'lastname':newData['lastname'],
    'name':newData['name']
    }
    #################output
    -ExpressionAttributeNames
    -ExpressionAttributeValues
    -UpdateExpression
    """
    UpdateExpression = ["set "]
    ExpressionAttributeValues = dict()
    ExpressionAttributeNames=dict()

    for key, val in body.items():
        UpdateExpression.append(f" #{key} = :{key},")
        ExpressionAttributeValues[f":{key}"] = val
        ExpressionAttributeNames[f"#{key}"] = key
    return "".join(UpdateExpression)[:-1], ExpressionAttributeValues,ExpressionAttributeNames

function Call

my_data={
'newval':newData['newval'],
'lastname':newData['lastname'],
'name':newData['name']
}
a, v,z = generate_update_att(my_data)
my_table.update_item(
    Key={'id':my_id},
    UpdateExpression=my_UpdateExpression,
    ExpressionAttributeValues=dict(my_ExpressionAttributeValues),
    ExpressionAttributeNames=dict(my_ExpressionAttributeNames)
)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM