こんにちはsekitakaです。
DynamoDBを使っていてアイテムが既に存在する場合は、putItemしたくない場合があるかと思います。
そんなときはExpected
で「プライマリーキーの属性が無いこと」を条件にすれば、エラーになり書き込まれません。
以下にサンプルコードを載せておきます。
# coding:utf-8
# !/usr/bin/python
import boto3
import botocore.exceptions
REGION = 'us-east-1'
client = boto3.client('dynamodb', region_name='us-east-1')
try:
client.put_item(
TableName='table_name',
Item={
"primary_key": {"S": "key_23"},
"some_value": {"S": "foo"}
},
Expected={
"primary_key": {
"Exists": False
}
}
)
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == 'ConditionalCheckFailedException':
print "DUPLICATE"
else:
# 重複以外のエラーなのでraise
raise
except
で直接ConditionalCheckFailedException
を指定したかったのですが、うまく行かなかったので重複の場合を検知するのに、一手間かかってしまいますが、getItemするよりアトミックなのでよい方法だと思います。