How do I conditionally insert an item into a dynamodb table using boto3

后端 未结 3 672
無奈伤痛
無奈伤痛 2020-12-25 12:18

If I have a table with a hash key of userId and a range key of productId how do I put an item into that table only if it doesn\'t already exist using boto3\'s dynamodb bindi

相关标签:
3条回答
  • 2020-12-25 12:54

    The documentation for this unfortunately isn't super clear. I needed to accomplish something similar, and here's what worked for me, using boto3:

    try:
        table.put_item(
            Item={
                'foo':1,
                'bar':2,
            },
            ConditionExpression='attribute_not_exists(foo) AND attribute_not_exists(bar)'
        )
    except botocore.exceptions.ClientError as e:
        # Ignore the ConditionalCheckFailedException, bubble up
        # other exceptions.
        if e.response['Error']['Code'] != 'ConditionalCheckFailedException':
            raise
    

    Similar to the other answer, the key is in the attribute_not_exists function, but it was unclear to me initially how to get that to work. After some experimentation, I was able to get it going with the above.

    0 讨论(0)
  • 2020-12-25 13:07

    You dont need the sortkey( or range key) just the partition key or hash key is enough.

    try:
        table.put_item(
            Item={
                'foo':1,
                'bar':2,
            },
            ConditionExpression='attribute_not_exists(foo)'
        )
    except botocore.exceptions.ClientError as e:
        # Ignore the ConditionalCheckFailedException, bubble up
        # other exceptions.
        if e.response['Error']['Code'] != 'ConditionalCheckFailedException':
            raise
    
    0 讨论(0)
  • 2020-12-25 13:15

    i think that you will get better documentation using client.put_item rather than table.put_item

    from boto3 documentation:

    To prevent a new item from replacing an existing item, use a conditional expression that contains the attribute_not_exists function with the name of the attribute being used as the partition key for the table. Since every record must contain that attribute, the attribute_not_exists function will only succeed if no matching item exists.

    ConditionExpression:

    ConditionExpression (string) -- A condition that must be satisfied in order for a conditional PutItem operation to succeed.

    An expression can contain any of the following:

    Functions: attribute_exists | attribute_not_exists | attribute_type | contains | begins_with | size These function names are case-sensitive.

    i am using dynamodb2 overwrite parameter on item.save()

    0 讨论(0)
提交回复
热议问题