Dynamodb 基于排序键模式批量删除

问题描述 投票:0回答:1

我有一个具有以下结构的 DynamoDB 表:

sk             |  pk
---------------|-----
1#2023-12-01   |  abv
1#2023-12-02   |  abv
1#2023-12-03   |  abv
1#2023-12-04   |  abv
1#2023-12-05   |  abv
2#2023-12-01   |  abv
2#2023-12-02   |  abv
2#2023-12-03   |  abv
2#2023-12-04   |  abv
2#2023-12-05   |  abv
...
20#2023-12-11  |  abv
20#2023-12-12  |  abv
20#2023-12-12  |  abv

现在,我想对此表执行批量删除操作,其中

pk = 'abv'
sk
表示 1 到 30 之间的动态整数,后跟文字
#
,然后是日期部分
YYYY-MM-DD
,其必须小于当前日期(假设当前日期是
2023-12-12
)。本质上,我想删除日期小于
1-30#2023-12-12
的所有项目。因此,在对表进行删除操作后,最终的表应该只包含以下项目:

sk             |  pk
---------------|-----
20#2023-12-12  |  abv
20#2023-12-12  |  abv

如何使用批量删除操作在 DynamoDB 中实现此目的?有关构建批量删除请求或任何其他优化编码方式的指导吗?我在想这个,但我不喜欢 Dynamodb 的

scan()
操作。

from datetime import datetime, timedelta
from typing import Dict, List
class Dynamodb:

    def batch_delete_old_data(self, pk: str):
        try:
            # Calculate the date to keep (e.g., today's date)
            date_to_keep = datetime.now().strftime('%Y-%m-%d')

            # Scan for all items with the specified pk
            response = self._table.scan(
                FilterExpression=Key('pk').eq(pk)
            )

            items_to_delete = [{'pk': item['pk'], 'sk': item['sk']} for item in response.get('Items', [])
                               if self.extract_date_part(item['sk']) < date_to_keep]

            with self._table.batch_writer() as batch:
                for item in items_to_delete:
                    batch.delete_item(Key=item)

            return {"message": "Old data cleanup successful"}

        except Exception as e:
            # Handle errors appropriately
            raise Exception(f"Error: {str(e)}")

    @staticmethod
    def extract_date_part(sk: str) -> str:
        # Extract the date part from the sk, assuming format "prefix#date"
        return sk.split('#')[-1] if '#' in sk else sk

python amazon-web-services amazon-dynamodb boto3
1个回答
0
投票

不清楚您是否有带有排序键的项目

20#2023-12-02
删除后它还会保持存在吗?如果是这样: 您需要执行 N 个查询请求才能获取您需要的项目。

如果没有: 您想要实现的是范围删除,DynamoDB 不支持此功能。

要实现您的用例,您必须首先

Query
检索 SK
between
X 和 Y 的所有项目。因此,不要使用
Scan
,而是使用
Query
,这将是更优化的。

根据结果,循环遍历

BatchWrite
,每批删除 25 个项目。或者当您使用批处理编写器时,您可以传递整个结果集,它会自动分成 25 个。

© www.soinside.com 2019 - 2024. All rights reserved.