boto3在python中有条件删除

cl25kdpy  于 2023-03-04  发布在  Python
关注(0)|答案(2)|浏览(133)

我有一个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'。我如何做一个条件删除,只有当键和值存在?谢谢

iswrvxsc

iswrvxsc1#

我想通了。
希望这对任何人都有帮助

def deleteItem(user, id):
    try:
        resource.delete_item(
           Key={'user': user, 'id': id},
           ConditionExpression='attribute_exists(id)'
           )
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] in ['ConditionalCheckFailedException',
         'ParamVAlidationError']:
              print(e.response['Error']['Message'])
        else:
            raise
    else:
        print("delete successful")
c3frrgcw

c3frrgcw2#

我知道这是旧的,但我发现这是通过谷歌,并可能会需要它在未来。
给定一个DDB表,分区键为id,还有一个额外的属性Test,我们只能在Test == foo的值如下时删除一行:

import json
import boto3
import botocore

dynamo_db = boto3.client('dynamodb')

def lambda_handler(event, context):
    try:
        response = dynamo_db.delete_item(
            TableName='TestTable',
            Key={'id': {'S': 'myID'}},
            ExpressionAttributeNames={
                '#sk': 'Test'
            },
            ExpressionAttributeValues={
                ':sk': {'S': 'bar'},
            },
            ConditionExpression='#sk = :sk'
        )
        return response
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] == 'ConditionalCheckFailedException':
            print("conditional delete failed because attribute did not match")
        else:
            raise e
    print('done')

对于简单的字段名和值,ExpressionAttributeNamesExpressionAttributeValues参数可能是多余的,但是在字段中有特殊字符的情况下会更加严格。
这种条件删除之所以有用,是因为DynamoDB最终是一致的(默认情况下)。假设您正在跟踪会话-一个进程可能会在断开连接时运行以删除会话,但用户可能会在此期间重新连接。如果您的分区键是这种情况下的用户ID,如果行在触发和删除之间被更新,您不希望删除new会话。因此,条件删除允许您通过检查特定属性来验证是否正在删除旧行(比如时间戳之类的)。

相关问题