更新DynamoDB中保留关键字的记录



根据record_id 7在DynamoDB中映射的数据,我想用新值

更新客户
"customer": {
"value": "id2",
"label": "Customer2"
}

但是,dyanamoDB不允许更新,因为"ValidationException: Invalid UpdateExpression: Attribute name是一个保留关键字;保留关键字:value".

记录在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
)

UpdateExpression期望一个字符串,而你正在传递一个列表:

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

我还建议您打印这些值,并检查它们是否符合您传递的参数的正确语法。

对于嵌套值,只需遵循相同的概念:

#customer.#value

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

如果您共享您尝试的查询表达式,那么对我来说将更容易,但在保留字的情况下,您需要在查询中重命名字段:

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

最新更新