How do I conditionally insert an item into a dynamodb table using boto3
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.
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
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()