削除 - table query dynamodb python




boto3を使ってdynamodbテーブルに条件付きで項目を挿入するにはどうすればいいですか? (2)

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これらの関数名は大文字と小文字を区別します。

私はitem.save() dynamodb2 上書きパラメータを使用しています

ハッシュキーが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を持つアイテムが存在するかどうか。


これに関する文書は残念ながらそれほど明確ではありません。 私は似たようなことを成し遂げる必要がありました、そして、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関数にありますが、最初はそれを機能させる方法が不明でした。 いくつかの実験の後、私はそれを上の通りにすることができました。





boto3