【问题标题】:How to batch upsert(insert or update) statements in dynamodb?如何在 dynamodb 中批量更新插入(插入或更新)语句?
【发布时间】:2022-12-21 14:49:23
【问题描述】:

我有一个需要批量插入或更新 dynamodb 请求的用例,但我找不到解决它的方法。欢迎任何建议,谢谢。

我的用例

  • 用例 #1:对于用户实体,我们将发送添加/更新/删除请求
  • 用例 #2:对于 Credit 实体,无论是否存在记录,我们都只会发送更新请求。

并且用例 #1 和 #2 混合在一起,我们需要将它们一起批处理。

我尝试了如下几种方法:

使用 batchWrite

问题是我们只能批处理PutRequest和DeleteRequest。它非常适合Use case #2,因为如果那里没有记录,PutRequest 将创建一个。如果有,PutRequest 将完全替换它。但它不太适合Use case #1,因为对于Update User请求,它只会将修改后的列留在数据库中。例如,如果我只更新名称列,PutRequest 将完全替换,只保留名称列。是的,我们可以在更新时提供所有的列,但这并不理想。

使用 PartiQL

PartiQL 不支持批处理 Insert Update Delete 语句。它很适合Use case #1,但不适合Use case #2。例如,如果我只使用Insert,当已经存在记录时,Insert会报重复错误。如果我只用Update,如果不存在记录,Update会报条件请求错误。如果我将Insert和Update放在一起,PartiQL会抱怨两个语句不能指向同一条记录。而且我认为PartiQL 不会支持存储过程、插入或更新之前的查询。

概括

无论如何,如果没有更好的方法,我将不得不使用batchWrite并将所有列放入更新请求中。它并不理想,但它是可行的,不像 PartiQL 方法,它没有绕过 Use case #2。

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    如果项目不存在,UpdateItem 支持更新插入。 在我的例子中,每次写新记录时我都必须增加一个数字属性。 我正在使用单表设计。所以使用 BatchWrite 你可以有 2 次写入:

    1. 创建新项目
    2. 使用 ADD 操作更新 - 不是 SET

      下面是 C# 代码 sn-p:

      var trx2 = new TransactWriteItem()
      {
          Update = new Update
          {
              Key = new Dictionary<string, AttributeValue>
              {
                  { "PK" , new AttributeValue { S = model.PK }},
                  { "SK" , new AttributeValue { S = model.SK }},
              },
              ExpressionAttributeNames = new Dictionary<string, string>
              {
                  {"#V", "Value"}
              },
              ExpressionAttributeValues = new Dictionary<string, AttributeValue>
              {
                  {":incr", new AttributeValue {N = "1"}},
              },
              UpdateExpression = "ADD #V :incr",
              TableName = this.tableName,
          }
      }
      

      我希望这有帮助 :)

    【讨论】:

      猜你喜欢
      • 2016-05-02
      • 2020-12-01
      • 2011-09-11
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2012-02-16
      相关资源
      最近更新 更多