DynamoDB update_item覆盖项目

时间:2017-12-27 21:37:45

标签: python amazon-web-services

更新项目正在覆盖我的项目,而不是在列表中添加新项目。 按照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}}

只要我保持相同的设备名称,它就会覆盖它。它应该只是添加另一个AliasCreateddateReserveQuanityAvailableQuanity到最后。

1 个答案:

答案 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也必须是一组字符串。
  •