繁体   English   中英

Invalid UpdateExpression:属性名是保留关键字; 保留关键字:值

[英]Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: value

我正在尝试使用以下 dictData 更新 dynamodb 中的记录,我有RESERVER_KEYWORDS数组,它在 dynamoDB 中保留了关键字。 请检查我试图用 reserve 关键字替换的代码段。 给定记录中使用的关键字的customer.valueaction.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 保留关键字发生冲突。

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

此外,我相信您应该查看 UpdateItem 预期的参数,以确保您传递正确的值:

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html

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

#customer.#value

ExpressionAttributeNames={ 
   "#customer":"customer",
   "#value":"value"
   },
UpdateExpression="SET #customer.#value = :val"

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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