当前位置: 首页 > 知识库问答 >
问题:

使用带有分区键和排序键的bash删除DynamoDB表中的所有项

栾鸣
2023-03-14

我正在尝试使用bash中的AWS CLI删除同时具有分区和排序键的DynamoDB表中的所有项目。到目前为止,我发现的最好的事情是:

aws dynamodb scan --table-name $TABLE_NAME --attributes-to-get "$KEY" \
--query "Items[].$KEY.S" --output text | \
tr "\t" "\n" | \
xargs -t -I keyvalue aws dynamodb delete-item --table-name $TABLE_NAME \
--key "{\"$KEY\": {\"S\": \"keyvalue\"}}"

但这对于同时具有分区键和排序键的表不起作用,而且我还不能使它对这样的表起作用。知道如何修改脚本以使其适用于具有复合键的表吗?

共有3个答案

百里杰
2023-03-14

如果您对使用Node.js感兴趣,请查看此示例(我在这里使用TypeScript)。更多相关信息可以在AWS文档中找到。

import AWS from 'aws-sdk';
const DynamoDb = new AWS.DynamoDB.DocumentClient({
region: 'eu-west-1'

});
export const getAllItemsFromTable = async TableName => {
   const Res = await DynamoDb.scan({ TableName }).promise();
   return Res.Items;
};

export const deleteAllItemsFromTable = async (TableName = '', items:{ id: string }, hashKey) => {
  var counter = 0;
  //split items into patches of 25
  // 25 items is max for batchWrite
  asyncForEach(split(items, 25), async (patch, i) => {
    const RequestItems = {
      TableName: patch.map(item => {
        return {
          DeleteRequest: {
            Key: {
              id: item.id
            }
          }
        };
      })
    };
    await DynamoDb.batchWrite({ RequestItems }).promise();
    counter += patch.length;
    console.log('counter : ', counter);
  });
};

function split(arr, n) {
  var res = [];
  while (arr.length) {
    res.push(arr.splice(0, n));
  }
  return res;
}

async function asyncForEach(array, callback) {
  for (let index = 0; index < array.length; index++) {
    await callback(array[index], index, array);
  }
}

const tableName = "table"
// assuming table hashKey is named "id"
deleteAllItemsFromTable(tableName,getAllItemsFromTable(tableName))
陈实
2023-03-14

更正@Cheruvian发布的内容。以下命令有效,创建架构时需要排除的字段很少。json。

aws dynamodb describe-table --table-name $table_name | jq '.Table | del(.TableId, .TableArn, .ItemCount, .TableSizeBytes, .CreationDateTime, .TableStatus, .LatestStreamArn, .LatestStreamLabel, .ProvisionedThroughput.NumberOfDecreasesToday, .ProvisionedThroughput.LastIncreaseDateTime)' > schema.json

aws dynamodb delete-table --table-name $table_name

aws dynamodb create-table --cli-input-json file://schema.json
吕高昂
2023-03-14

根据表的大小,这可能会太贵,导致停机。请记住,删除的成本与写入的成本相同,因此您将受到配置的WCU的限制。只需删除并重新创建表就可以更简单、更快。

# this uses jq but basically we're just removing 
# some of the json fields that describe an existing 
# ddb table and are not actually part of the table schema/defintion
aws dynamodb describe-table --table-name $table_name | jq '.Table | del(.TableId, .TableArn, .ItemCount, .TableSizeBytes, .CreationDateTime, .TableStatus, .ProvisionedThroughput.NumberOfDecreasesToday)' > schema.json
# delete the table
aws dynamodb delete-table --table-name $table_name
# create table with same schema (including name and provisioned capacity)
aws dynamodb create-table --cli-input-json file://schema.json

如果您真的愿意,您可以单独删除每个项目,并且您走在正确的轨道上,您只需要在扫描投影和删除命令中指定散列和范围键。

aws dynamodb scan \
  --attributes-to-get $HASH_KEY $RANGE_KEY \
  --table-name $TABLE_NAME --query "Items[*]" \
  # use jq to get each item on its own line
  | jq --compact-output '.[]' \
  # replace newlines with null terminated so 
  # we can tell xargs to ignore special characters 
  | tr '\n' '\0' \
  | xargs -0 -t -I keyItem \
    # use the whole item as the key to delete (dynamo keys *are* dynamo items)
    aws dynamodb delete-item --table-name $TABLE_NAME --key=keyItem

如果你想得到超级花哨的,你可以使用state-table调用来获取散列和范围键来填充$HASH_KEY$RANGE_KEY,但我会把它作为一个练习留给你。

 类似资料:
  • 与主键、复合键和候选键相比,dynamodb中的分区键和排序键是什么?

  • 如何使用Amazon DynamoDB模块获取仅匹配分区键(表有排序键)的所有项目。我正在使用GetItemRequest查询没有排序键。 当我仅使用分区键和GetItemRequest进行查询时,我会遇到以下错误。 <代码>原因:软件。亚马逊。awssdk。服务。发电机B。模型DynamoDbException:提供的关键字元素与架构不匹配(服务:DynamoDb,状态代码:400,请求ID:6

  • 我试图使用batchGetItem从表中返回多个项的属性,但似乎它只适用于分区键和范围键的组合,但是如果我只想通过主键识别请求的项,该怎么办?唯一的方法是创建不带范围键的表吗? 根据官方留档: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html 如果表有一个复合主键(分

  • 我有一个带有主键和排序键的表;因为这是一个复合键,所以我有多个主键与不同的排序键映射。 如何获取与特定主键关联的所有排序键? 我尝试使用“Get”操作,但这似乎也需要排序键(尽管我正在寻找这些键)。我还研究了“BatchGet”操作,但这是针对多个不同的键,而不是针对具有多个不同排序键的单个主键。 我也尝试过“查询”,但没有成功,但我对这一点了解较少,所以这可能就是解决方案——是这样吗?我还知道,

  • 我正在为DynamoDb使用AWS(JS)文档客户端库,并试图从表(分区排序键)中执行。问题是,我想按分区键和任何排序键获取所有项。 如果我没有在中定义sort key,我会得到

  • 我试图查询具有分区键和排序键的表(但是分区键和排序键是1:1,我只想使用分区键[仅返回一项]进行查询)。 这是我尝试过的代码,但没有成功(testId是分区键名,1234567890是字符串形式的分区键值);你们都知道我可以只使用分区键进行查询的方法吗?记住,由于分区键和排序键是1:1,所以只会返回一个项?提前非常感谢您。[这是我的第一篇堆栈溢出帖子-很抱歉,如果我用词不当,我很乐意回答关于我的措