我有一个dynamoDB数据库,其模式如下:
user id payload
123 abcd some value
456 abcd some value
如何删除用户456对应的id abcd?如果用户456不存在怎么办?我尝试了:
try:
resource.delete_item(
Key={'user': 456,
'id': 'abcd'
})
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == 'ConditionalCheckFailedException':
print(e.response['Error']['Message'])
else:
raise
else:
print("DeletePortfolio Successful...")
我总是得到语句“DeletePortfolio Successful”,即使我放置了一个随机用户,如478,或保留用户456,并放置了一个不正确的ID,如'defg'。我如何做一个条件删除,只有当键和值存在?谢谢
2条答案
按热度按时间iswrvxsc1#
我想通了。
希望这对任何人都有帮助
c3frrgcw2#
我知道这是旧的,但我发现这是通过谷歌,并可能会需要它在未来。
给定一个DDB表,分区键为
id
,还有一个额外的属性Test
,我们只能在Test == foo
的值如下时删除一行:对于简单的字段名和值,
ExpressionAttributeNames
和ExpressionAttributeValues
参数可能是多余的,但是在字段中有特殊字符的情况下会更加严格。这种条件删除之所以有用,是因为DynamoDB最终是一致的(默认情况下)。假设您正在跟踪会话-一个进程可能会在断开连接时运行以删除会话,但用户可能会在此期间重新连接。如果您的分区键是这种情况下的用户ID,如果行在触发和删除之间被更新,您不希望删除new会话。因此,条件删除允许您通过检查特定属性来验证是否正在删除旧行(比如时间戳之类的)。