更新项目正在覆盖我的项目,而不是在列表中添加新项目。 按照here的说明,我应该获得更新列表。
我的代码:
dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://localhost:8000")
table = dynamodb.Table('WishListTest')
device = input('What is the Item being requested?\n')
device = device.upper()
aliasInput = input('What is the Alias of the user?\n')
aliasInput = aliasInput.upper()
date = int((time.strftime("%d%m%Y")))
response = table.update_item(
Key={
'Device': device,
},
UpdateExpression="set RequestList.Alias = :r, RequestList.Createddate = :d, AvailableQuanity = :a, "
"ReserveQuanity = :q",
ExpressionAttributeValues={
':r': aliasInput,
':d': date,
':a': 0,
':q': 0
}
)
print("PutItem succeeded:")
print(json.dumps(response, indent=4, cls=DecimalEncoder))
我的输出如下:
{"ReserveQuanity": 0, "AvailableQuanity": 0, "Device": "DELL", "RequestList": {"CreatedDate": 19122017, "Alias": "JONJP", "Createddate": 27122017}}
只要我保持相同的设备名称,它就会覆盖它。它应该只是添加另一个Alias
,Createddate
,ReserveQuanity
和AvailableQuanity
到最后。
答案 0 :(得分:0)
首先,您需要确保要添加的所有属性都是lists or sets。
如果您使用列表,则需要在更新表达式中使用list_append
函数,如boto3 documentation中所述。否则,您只需像现在一样覆盖预先存在的值:
SET
- 向项添加一个或多个属性和值。如果这些属性中的任何一个已存在,则它们将被新值替换。您还可以使用SET
来添加或减去Number类型的属性。例如:SET myNum = myNum + :val
SET
支持以下功能:
if_not_exists (path, operand)
- 如果项目在指定路径中不包含属性,则if_not_exists
计算为操作数;否则,它评估路径。您可以使用此功能来避免覆盖项目中可能已存在的属性。list_append (operand, operand)
- 评估添加了新元素的列表。您可以通过反转操作数的顺序将新元素附加到列表的开头或结尾。
如果您使用套装,则不需要list_append
功能,但必须使用ADD
操作代替SET
操作:
ADD
- 如果该属性尚不存在,则将指定的值添加到项目中。如果该属性确实存在,则ADD
的行为取决于属性的数据类型:
- 如果现有数据类型是一个集合,并且
Value
也是一个集合,那么Value
会添加到现有数据集中。- 如果现有数据类型是一个集合,并且
Value
也是一个集合,则Value
将添加到现有集合中。例如,如果属性值为集合[1,2]
,并且指定了ADD操作[3]
,则最终属性值为[1,2,3]
。如果为set属性指定了ADD
操作,并且指定的属性类型与现有的set类型不匹配,则会发生错误。两个集必须具有相同的原始数据类型。例如,如果现有数据类型是一组字符串,则Value
也必须是一组字符串。