2016-05-05 28 views
8

如果我有一个带有userId的散列键和productId的范围键的表,只有当它不存在时才可以将项目放入该表中使用boto3的dynamodb绑定?如何使用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的项目。

回答

22

的文档,这不幸的是,不是超清晰。我需要完成类似的东西,这里是为我工作,使用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功能,但它是我不清楚最初如何得到这工作。经过一些实验后,我能够用上述方法来解决问题。

1

我认为你会使用client.put_item从boto3 documentation获得更好的文档,而不是table.put_item

为了防止新的项目从替换现有项目,使用条件表达式其中包含attribute_not_exists函数以及用作表的分区键的属性的名称。由于每个记录都必须包含该属性,因此只有在没有匹配项存在的情况下,attribute_not_exists函数才会成功。

ConditionExpression:

ConditionExpression(字符串) - 必须在 为了有条件PutItem操作成功,满足的条件。

表达式可以包含任何下列的:

功能:attribute_exists | attribute_not_exists | attribute_type | 包含| starts_with |大小这些函数名称区分大小写。

我使用dynamodb2 overwrite parameteritem.save()

+0

呃...我已阅读文档。但是我发现写一个条件表达式是非直观的,我担心我编写它的方式可能不会做我认为正在做的事情。所以想知道其他人是否真的做过。你有一个你如何做的例子吗?我会更新我的答案,显示我是如何做到的 – aychedee

+0

我加入到答案中,我如何做到这一点..(使用覆盖) –

+0

啊好吧...这是使用博托。我在问boto3。但感谢您花时间看看。 – aychedee

相关问题