【问题标题】:DynamoDB PutItem keeps overwriting previous entryDynamoDB PutItem 不断覆盖以前的条目
【发布时间】:2020-11-27 14:59:20
【问题描述】:

我想从我的 lex 机器人下订单到 dynamoDB,但是 PutItem 操作每次都会覆盖(如果客户名称已经在表中)。 我从文档中知道,如果主键相同,它将执行此操作。

我的目标是将每个订单放入数据库,以便将来轻松搜索。 我在下面附上了一些截图。任何帮助表示赞赏

https://imgur.com/a/mLpEkOi

def putDynam(orderNum, table_custName, slotKey, slotVal):
    client = boto3.resource('dynamodb')
    table = client.Table('blah')
    
    input = {'Customer': table_custName, 'OrderNumber':orderNum[0], 'Bun Type': slotVal[5], 'CheeseDecision': slotVal[1], 'Cheese Type': slotVal[0], 'Pickles': slotVal[4], 'SauceDecision': slotVal[3], 'Sauce Type': slotVal[2]}
    
    action = table.put_item(Item=input)

【问题讨论】:

  • 什么是主键?每个订单都是独一无二的吗?因为它必须是
  • 请贴出代码而不是截图
  • @LLL 所以目前主键是客户名称,我不太明白每个条目的主键如何是唯一的。
  • @LLL 我已经添加了上面的代码。

标签: amazon-web-services aws-lambda amazon-dynamodb boto3


【解决方案1】:

主键用于标识表中的每个项目。只能有 1 条记录具有特定的主键(主键是唯一的)。

客户名不是一个好的主键,因为它不是唯一的。

在这种情况下,您可以有一个带有一些生成的 Id(在您的示例中为 orderNumber?)的订单,这可能是主键,而 Customer(最好是 CustomerId)作为属性。

或者您可以有一个由CustomerIdOrderId 组成的复合主键。

如果你想按客户查询订单,如果它不在主键中,你可以使用索引。

我建议您首先阅读 DynamoDB 的工作原理。您可以从 AWS 的 this 数据建模教程开始。

【讨论】:

    【解决方案2】:

    因此,基本上,客户名称必须是唯一的,因为它是您的主键。您不能有两行具有相同的主键。一种方法是使用一个增量值作为 id,每个插入只需将 i+1 作为其 id。

    您可以查看此堆栈溢出问题以获取更多信息:https://stackoverflow.com/a/12460690/11593346

    【讨论】:

      【解决方案3】:

      根据https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.put_item,您可以:

      "执行条件放置操作(如果具有指定主键的项不存在,则添加一个新项)"

      注意

      要防止新项目替换现有项目,请使用包含attribute_not_exists 函数的条件表达式,并将属性名称用作表的分区键。由于每条记录都必须包含该属性,attribute_not_exists 函数只有在不存在匹配项时才会成功。

      另见DynamoDB: updateItem only if it already exists

      如果您确实需要知道该项目是否存在以便触发异常逻辑,请先运行查询以查看该项目是否已存在,甚至不要调用 put_item。您还可以探索使用 ConditionExpression 和 ReturnValues 选项之一(用于 put_item 或 update_item)的组合是否可以返回足够的数据让您知道某个项目是否存在。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-22
        • 1970-01-01
        • 2013-02-21
        • 2018-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多