繁体   English   中英

DynamoDB 批量更新

[英]DynamoDB Batch Update

DynamoDB 中是否有任何 API 可以更新一批项目? 有一个 API 可以批量写入新项目 ( BatchWriteItem ) 并使用UpdateItem更新单个项目,但是是否可以在一次调用中更新多个项目?

目前 DynamoDB 中没有可用的批量更新项 API。

DynamoDB API 操作列表

我现在知道这是一个老问题,但 DynamoDB 最近添加了一个支持更新的事务 API:

更新 — 启动 UpdateItem 操作以编辑现有项目的属性或将新项目添加到表中(如果尚不存在)。 使用此操作可以有条件地或无条件地添加、删除或更新现有项目的属性。

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transaction-apis.html

DynamoDBMapper.batchSave(Iterable<? extends Object> objectsToSave)我使用DynamoDBMapper.batchSave(Iterable<? extends Object> objectsToSave)

不,目前没有批量更新,您可以使用单个更新项调用并对其进行工作流,例如 AWS SWF 或 AWS 步骤函数

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html

BatchWriteItem 无法更新项目。 要更新项目,请使用 UpdateItem 操作。 BatchWriteItem 操作在一个或多个表中放置或删除多个项目

参考: http : //docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html

我使用了一个dynamoDB更新触发器,然后我做了一个模板,告诉我我应该修改哪些项目,我把它们放在一个队列中,然后它们读取另一个队列中的消息以一一更新

我在类似的查询中找到了这个线程,希望这可能会有所帮助。

DynamoDB 支持文档中描述的批处理语句执行。 这适用于客户端对象而不是资源对象。 然后我使用了 DynamoDB 支持的 PartiQL 更新语句并在此处进行了描述。

Python 代码参考如下所示:

client = boto3.client('dynamodb')

batch = ["UPDATE users SET active='N' WHERE email='<user_email>' RETURNING [ALL|MODIFIED] [NEW|OLD] *;", "UPDATE users ..."]  # Limit to 25 per batch
request_items = [{'Statement': _stat} for _stat in batch]
batch_response = client.batch_execute_statement(Statements=request_items)

这是最少的代码。 您可以使用多线程同时执行多个批处理。

不完全是批量删除,但我刚才在 python lambda 函数中做了这个:

    import json
    import boto3

    client = boto3.client('dynamodb')

    def lambda_handler(event, context):
    
    idList = [
        "id1",
        "id2
        ...
        "id100",
    ]

    for itemID in idList:
        test = client.update_item(
                TableName='Your-Table-Name',
                Key={
                    'id': {
                        'S': itemID
                    }
                },
                UpdateExpression="set exressionToChange=:r",
                ExpressionAttributeValues={
                        ':r': {'S':'New_Value'}},
                ReturnValues="UPDATED_NEW")
        
    
    return

为了获取 idList,我下载了 CSV 中的值,将它们复制到 VSCode 中,然后进行查找并用正则表达式替换( CMD - F然后单击.\* )并将查找设置为“ .* ”并替换为“ $0 ” , 它基本上用引号和逗号替换了每一行

所以基本上之前:

    id1
    id2
    id3
    ...

之后

    "id1",
    "id2",
    "id3",
    ...

只需将“ idList = [...] ”替换为您的 ID、“ Your-Table-Name ”、“ expressionToChange ”,最后是“ New_Value ”。

此外,您将授予 lambda 函数权限以在 DynamoDB 中“更新项目”,否则您将收到错误消息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM