DynamoDB 在使用 update_item 时添加项目而不是更新项目

DynamoDB adds item instead of updates item when using update_item

我有一个从 DynamoDB table 填充的 html table。单击一行会在模态中弹出一个编辑表单。输入的数据被发送到烧瓶服务器以更新以模式形式编辑的项目 - 使用 AWS DynamoDB。阅读 AWS 文档后,正确的方法是使用 update_item。但是,这样做时会再次添加该项目而不是更新该项目。我使用 AWS here 编写以下脚本。在我的 DynamoDB table 中,primary partition keyKEY1primary sort keyKEY2 在下面的参考中。

table = dynamodb.Table('table_name') #define DynamoDB table
key1 = account_id #string value of account id
key2 = request.form["KEY2"] #this is a read only field in the form, so the key does not get updated here
form_val1 = request.form["input1"]
form_val2 = request.form["input2"]
form_val3 = request.form["input3"]
form_val4 = request.form["input4"]
form_val5 = request.form["input5"]
form_val6 = request.form["input6"]
form_val7 = request.form["input7"]
form_val8 = request.form["input8"]
form_val9 = request.form["input9"]
            
#update item in dynamo     
table.update_item(
             Key={
             'KEY1': key1, #partition key
             'KEY2': key2 #sort key
             },
             UpdateExpression='SET dbField1 = :val1, dbField2 = :val2, dbField3 = :val3, dbField4 = :val4, dbField5 = :val5, dbField6 = :val6, dbField7 = :val7, dbField8 = :val8, dbField9 = :val9',
             ExpressionAttributeValues={
             ':val1': form_val1, 
             ':val2': form_val2, 
             ':val3': form_val3, 
             ':val4': form_val4,
             ':val5': form_val5, 
             ':val6': form_val6, 
             ':val7': form_val7, 
             ':val8': form_val8, 
             ':val9': form_val9
             }
             )

这是完整的查询吗? update_item 文档说 TableName 是必需的,我在您的代码段中没有看到。

来自updateitem docs

Edits an existing item's attributes, or adds a new item to the table if it does not already exist.

确保主键(分区键 排序键)在您的 table 中是唯一的。如果不是,updateitem 将在数据库中创建一个新项目。

您确定项目的主键已经存在于数据库中吗?

你不能,我会向你解释什么是不可能的。

当您在 dynamo DB 上使用键和排序键创建 table 时,您会自动在键和排序键之间创建索引。我们知道索引是 inmutable,这意味着您不能更新密钥。出于这个原因,当您更新 dynamo 时创建一个新元素。

这是您的 table 定义的问题,因为您永远不需要更改键或排序键。仅使用索引而不是排序索引重新创建 table(因为如果您的应用程序可以更改没有意义的排序索引)。