无法使用boto3

时间:2019-02-22 09:28:22

标签: python-3.x amazon-web-services amazon-dynamodb boto3

我有一个表,其中包含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中删除字符串?

Python代码:

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

我尝试过的事情:

  • 从设备ID周围删除set()
  • DELETE更改为REMOVE
  • 将我的头靠在墙上,乞求并恳求
  • 明确设置fakeID1使其显示为':s': set('fakeID1'),
  • 使用语法':s': {'SS': [oldDeviceID]},
  • 四倍检查allDevices与DDB上的代码是否相同
  • allDevices添加内容-可以完美运行
  • 将运行时从Python 3.7更改为Python 2.7

1 个答案:

答案 0 :(得分:0)

您只需要对ExpressionAttributeValues进行较小的修改。要将单个字符串转换为集合,必须首先将其制成列表。

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

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

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

此删除操作将表明操作成功,并且即使未进行更改,也会返回“已更新”属性。我有一些非常相似的代码;无法从响应中得知是从字符串集中删除了元素还是从头开始从未删除过元素。

我还没有尝试过,但是我相信添加ConditionExpression会给您反馈(操作将成功或引发异常)。