[英]Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: value
我正在尝试使用以下 dictData 更新 dynamodb 中的记录,我有RESERVER_KEYWORDS数组,它在 dynamoDB 中保留了关键字。 请检查我试图用 reserve 关键字替换的代码段。 给定记录中使用的关键字的customer.value
和action.value
类型的主要问题。 我不确定如何用#替换。
但是我收到错误
CRITICAL 无法更新表格中的记录。 原因如下: ValidationException: Invalid UpdateExpression: Attribute name is a reserved keyword; 保留关键字:值
dictData = {
':line_items': [{
'search_product': 'dd',
'quantity': '10'
}]
'email': 'xyz@email',
'poc_name': 'XYZ',
'contact': '90912',
'action': {
'value': 'id1',
'label': 'In Progress'
},
'terms': 'Cash',
'customer': {
'value': 'id1',
'label': 'Customer'
},
}
在 function 定义中:
updateExpression = ["set "]
updateValues = dict()
expression_attributes_names = {}
for key, value in dictData.items():
updateExpression.append(f" #{key}_alias = :{key.replace('.', '_')},")
updateValues[f":{key.replace('.', '_')}"] = value
expression_attributes_names[f"#{key}_alias"] = key
response = table.update_item(
Key={"_id": id},
UpdateExpression="".join(updateExpression)[:-1],
ExpressionAttributeValues=updateValues,
ReturnValues="UPDATED_NEW",
ExpressionAttributeNames=expression_attributes_names,
)
以上 function 将给出以下 expression_attributes_names、updateExpression、updateValues 的值。
expression_attributes_names: {}
updateExpression: ['set ', ' line_items = :line_items,', ' email = :email', ' poc_name = :poc_name,', ' contact = :contact,', ' action.value = :action_value,',
' action.label = :action_label,', ' terms = :terms,',
' customer.value = :customer_value,', ' customer.label = :customer_label,'
]
updateValues: {
':line_items': [{
'search_product': 'dd',
'quantity': '10'
}],
':email': 'xyz@email',
':poc_name': 'Test',
':contact': '90912',
':action_value': 'id1',
':action_label': 'In Progress',
':terms': 'Cash',
':customer_value': 'id1',
':customer_label': 'Customer'
}
您应该始终使用 ExpressionAttributeNames 以确保您不会与 DynamoDB 保留关键字发生冲突。
此外,我相信您应该查看 UpdateItem 预期的参数,以确保您传递正确的值:
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html
对于嵌套值,您只需遵循相同的概念:
#customer.#value
ExpressionAttributeNames={
"#customer":"customer",
"#value":"value"
},
UpdateExpression="SET #customer.#value = :val"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.