如何在 Go 中从 DynamoDB 表中删除多个项目

Posted

技术标签:

【中文标题】如何在 Go 中从 DynamoDB 表中删除多个项目【英文标题】:How to Delete Multiple Items from a DynamoDB Table in Go 【发布时间】:2021-03-10 09:13:28 【问题描述】:

我有一个包含以下项目的 DynamoDB 表:

type AuthEntry struct 
    UserID    string    `dynamodbav:"userId"`
    Token     string    `dynamodbav:"token"`
    CreatedOn time.Time `dynamodbav:"createdOn"`

我需要删除所有早于 5 分钟(CreatedOn Token 为空)的所有 AuthEntry 项目。我很清楚如何一次删除一个项目......但我想知道如何一次删除多个项目。非常感谢。

【问题讨论】:

可能是***.com/questions/62022594/…的副本 不,这不适用于 aws-sdk-go-v2... 您能进一步解释一下吗?据我所知,aws-sdk-go-v2 主要是增强了模块化……Seth 的反应很好,也很相似。 【参考方案1】:

我正在寻找一个像下面这样的例子......我希望它可以帮助像我这样的其他新手。例如,首先我使用Scan 检索过期条目,然后运行BatchWriteItemInput 实际删除它们。

import (
    "context"
    "time"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb/types"

)

var tableName = "USER_AUTH"

...

type AuthRepository struct 
    ctx context.Context
    svc *dynamodb.Client


...

func NewAuthRepository(ctx context.Context) (*AuthRepository, error) 
    cfg, err := config.LoadDefaultConfig(ctx)
    if err != nil 
        return nil, err
    

    return &AuthRepositoryctx, dynamodb.NewFromConfig(cfg), nil


...

func (r *AuthRepository) Collect(maxAge int) (int32, error) 
    t := time.Now().Add(time.Duration(maxAge*-1) * time.Millisecond).UTC()
    params := &dynamodb.ScanInput
        TableName:            aws.String(tableName),
        ProjectionExpression: aws.String("userId"),
        ExpressionAttributeValues: map[string]types.AttributeValue
            "t": &types.AttributeValueMemberS*aws.String(t.String()),
        ,
        FilterExpression: aws.String("createdOn < :t"),
    

    result, err := r.svc.Scan(r.ctx, params)
    if err != nil 
        return 0, err
    

    wr := make([]types.WriteRequest, result.Count)
    for _, v := range result.Items 
        authEntry := &AuthEntry
        if err := attributevalue.UnmarshalMap(v, &authEntry); err != nil 
        return 0, err
        
        wr = append(wr, types.WriteRequest
            DeleteRequest: &types.DeleteRequest
                Key: map[string]types.AttributeValue
                    "userId": &types.AttributeValueMemberS*aws.String(authEntry.UserID),
                ,
            )
    

    input := &dynamodb.BatchWriteItemInput
        RequestItems: map[string][]types.WriteRequest
            tableName: wr,
        ,
    

    _, err = r.svc.BatchWriteItem(r.ctx, input)
    return result.Count, nil

【讨论】:

【参考方案2】:

在删除方面,您有几个选择。

deleteItem - 按主键删除表中的单个项目。

batchWriteItem - BatchWriteItem 操作在一个或多个表中放置或删除多个项目。一次 BatchWriteItem 调用最多可写入 16 MB 数据,其中可包含多达 25 个放置或删除请求

TimeToLive - 您可以利用 DynamoDB 的生存时间 (TTL) 功能删除不再需要的项目。请记住,TTL 只会将您的项目标记为删除,实际删除可能需要长达 48 小时。

我不确定您表中的哪些项目是主键的一部分,因此很难给您举个例子。但是,此操作是一次删除多个项目的首选方法。

【讨论】:

以上是关于如何在 Go 中从 DynamoDB 表中删除多个项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个查询中从两个表中删除数据

在一个灵活的查询中从多个表中删除行

如何在迁移中从表中删除 softDeletes

检索DynamoDB表中的所有数据并随后清除表的最佳方法

如何在 SAP ASE Sybase 16 中从具有外键的表中删除行

从表中扫描多个电子邮件ID - DynamoDB