根据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"
}
)