DynamoDB update_item覆盖项目

问题描述 投票:0回答:1

更新项目将覆盖我的项目,而不是向列表中添加新项目。按照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到最后。

python amazon-web-services
1个回答
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也必须是一组字符串。
© www.soinside.com 2019 - 2024. All rights reserved.