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 key
是 KEY1
而 primary sort key
是 KEY2
在下面的参考中。
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
是必需的,我在您的代码段中没有看到。
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(因为如果您的应用程序可以更改没有意义的排序索引)。
我有一个从 DynamoDB table 填充的 html table。单击一行会在模态中弹出一个编辑表单。输入的数据被发送到烧瓶服务器以更新以模式形式编辑的项目 - 使用 AWS DynamoDB。阅读 AWS 文档后,正确的方法是使用 update_item
。但是,这样做时会再次添加该项目而不是更新该项目。我使用 AWS here 编写以下脚本。在我的 DynamoDB table 中,primary partition key
是 KEY1
而 primary sort key
是 KEY2
在下面的参考中。
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
是必需的,我在您的代码段中没有看到。
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(因为如果您的应用程序可以更改没有意义的排序索引)。