python-3.x - 无法使用 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
我尝试过的事情:
set()
从 deviceID 周围移除- 更改
DELETE
为REMOVE
- 把我的头撞在墙上,乞求和恳求
- 显式设置
fakeID1
以使其读取':s': set('fakeID1'),
- 使用语法
':s': {'SS': [oldDeviceID]},
allDevices
代码中与 DDB 相同的四重检查- 添加一些东西
allDevices
- 这完美无缺 - 将运行时从 Python 3.7 更改为 Python 2.7
解决方案
你只需要对你的 ExpressionAttributeValues 做一个小的修改。要将单个字符串转换为集合,您必须首先将其设为列表。
ExpressionAttributeValues={
':s': set([deviceID]),
}
请注意下面将变量放入 [] 以使其列表与不这样做之间的区别。
>>> deviceID = "WB529"
>>> set(deviceID)
set(['9', '2', 'B', '5', 'W'])
>>> set([deviceID])
set(['WB529'])
此删除操作将指示它成功并返回“更新”属性,即使没有进行任何更改。我有一些非常相似的代码;如果您从字符串集中删除了一个元素,或者它从不存在,则无法从响应中判断出来。
我没有尝试过,但我相信添加一个 ConditionExpression 会给你那个反馈(操作要么成功,要么抛出异常)。
推荐阅读
- javascript - 使用 flexbox 和“column-reverse”,在 Chrome 上滚动时页面会跳转
- javascript - 在 C# webview 中启用 javascript
- reactjs - 按ID删除帖子?
- sql-server - 如何获取上次服务状态的日期?
- python - 我写这个函数的逻辑错了吗?get_elements_that_equal_10_at_a_value
- java - JavaFx 问题。运行应用程序 lms.main.mainLoader 的异常
- node.js - 带有 typescript 编译错误的 RxJS Http Server
- javascript - 如何从全日历获取所有事件
- visual-studio-code - VS Code 快速文件导航不适用于自定义文件系统提供程序
- azure - 在 Azure 门户中,我在添加添加角色分配 -> 分配访问权限 ->“Azure AD 用户、组或服务原则”时没有找到此选项