如何在 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 表中删除多个项目的主要内容,如果未能解决你的问题,请参考以下文章