首页 > 解决方案 > 无法使用 boto3 从 DynamoDB StringSet 中删除项目

问题描述

我有一个包含 StringSet 类型属性的表。属性名称是allDevices. 我正在尝试从 StringSet 中删除设备 ID。但是,当我运行以下代码时,它不会从 StringSet 中删除字符串。它也不会抛出任何错误。尝试删除 deviceID 时,fakeID1响应为:

{'Attributes': {'allDevices': {'fakeID1', 'fakeID2'}}, 'ResponseMetadata': {'RequestId': '<removed>', 'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'Server', 'date': 'Fri, 22 Feb 2019 09:04:52 GMT', 'content-type': 'application/x-amz-json-1.0', 'content-length': '93', 'connection': 'keep-alive', 'x-amzn-requestid': '<removed>', 'x-amz-crc32': '<removed>'}, 'RetryAttempts': 0}}

如何让 DynamoDB 从 StringSet 中删除字符串?

蟒蛇代码:

dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
table = dynamodb.Table('sniffer-users')
try:
    response = table.update_item(
        Key={
            'username': user,
        },
        UpdateExpression="DELETE allDevices :s",
        ExpressionAttributeValues={
            ':s': set(deviceID),
        },
        ReturnValues="UPDATED_NEW"
    )
    print(response)
except ClientError as e:
    print(e.response['Error']['Message'])
    return -9

我尝试过的事情:

标签: python-3.xamazon-web-servicesamazon-dynamodbboto3

解决方案


你只需要对你的 ExpressionAttributeValues 做一个小的修改。要将单个字符串转换为集合,您必须首先将其设为列表。

ExpressionAttributeValues={
    ':s': set([deviceID]),
}

请注意下面将变量放入 [] 以使其列表与不这样做之间的区别。

>>> deviceID = "WB529"
>>> set(deviceID)
set(['9', '2', 'B', '5', 'W'])
>>> set([deviceID])
set(['WB529'])

此删除操作将指示它成功并返回“更新”属性,即使没有进行任何更改。我有一些非常相似的代码;如果您从字符串集中删除了一个元素,或者它从不存在,则无法从响应中判断出来。

我没有尝试过,但我相信添加一个 ConditionExpression 会给你那个反馈(操作要么成功,要么抛出异常)。


推荐阅读