削除 - table query dynamodb python
boto3を使ってdynamodbテーブルに条件付きで項目を挿入するにはどうすればいいですか? (2)
ハッシュキーがuserIdで範囲キーがproductIdのテーブルがある場合、boto3のdynamodbバインディングを使用してアイテムが存在しない場合にのみ、そのテーブルにアイテムを配置するにはどうすればよいですか。
put_itemへの通常の呼び出しは次のようになります。
table.put_item(Item={'userId': 1, 'productId': 2})
ConditionExpressionを使った私の呼び出しはこのようになります:
table.put_item(
Item={'userId': 1, 'productId': 2},
ConditionExpression='userId <> :uid AND productId <> :pid',
ExpressionAttributeValues={':uid': 1, ':pid': 3}
)
しかし、これは毎回ConditionalCheckFailedExceptionを発生させます。 同じproductIdを持つアイテムが存在するかどうか。
table.put_itemではなくclient.put_itemを使うとより良いドキュメントが得られると思います。
boto3 documentationから:
新しいアイテムが既存のアイテムを置き換えないようにするには、attribute_not_exists関数を含む条件式を使用して、そのテーブルのパーティションキーとして使用されている属性の名前を指定します。 すべてのレコードはその属性を含まなければならないので、attribute_not_exists関数は、一致するアイテムが存在しない場合にのみ成功します。
条件式:
ConditionExpression(string) - 条件付きPutItem操作が成功するために満たさなければならない条件。
式には、以下のいずれかを含めることができます。
関数:attribute_exists | attribute_not_exists | attribute_type | 含まれています begins_with | sizeこれらの関数名は大文字と小文字を区別します。
これに関する文書は残念ながらそれほど明確ではありません。 私は似たようなことを成し遂げる必要がありました、そして、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
他の答えと同様に、このキーはattribute_not_exists関数にありますが、最初はそれを機能させる方法が不明でした。 いくつかの実験の後、私はそれを上の通りにすることができました。