やったこと
DynamoDBテーブルで、同じプライマリーキーでputした場合どうなるのでしょうか
結果
同じプライマリーキーでput操作をすると、既存itemが上書きされた。
同じキーを持つ項目がテーブルにすでに存在する場合は、新しい項目に置き換えられる。
参考: 項目の読み込み
例) id = プライマリキー
{id: 0, name: "apple", price: 150, register: makimatsu}
↓
{id: 0, name: "banana", price: 200}
対策
-
条件付きの書き込みを使用する
- 同じプライマリキーを持つ既存の項目がない場合にのみ、PutItem オペレーションが成功するようにする
- 属性の 1 つに特定の値がある場合に UpdateItem オペレーションが項目を変更することを防ぐようにする
- 条件付き書き込みは、複数のユーザーが同じ項目を変更しようとする場合に役立つ
-
使用例
.py
putItem = {
id: 1, ## プライマリキー
name: 'orange',
price: 100
}
try:
## id=1のitemが存在しない場合のみputする
## id=1のitemが存在する場合は、ConditionalCheckFailedExceptionエラーが発生する
ret = table.put_item(
Item=putItem,
ConditionExpression=Attr('id').not_exists()
)
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == 'ConditionalCheckFailedException':
logger.error("一意制約違反のため、DynamoDbへの挿入失敗。すでに同様のキーのレコードが存在します。Item=%s", putItem)