LoginSignup
15
19

More than 5 years have passed since last update.

DynamoDBでアイテムがある場合は上書きしない

Posted at

こんにちは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するよりアトミックなのでよい方法だと思います。

15
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
19