DynamoDB 批量更新

79

在DynamoDB中是否有API可以批量更新项?虽然有一种写入新项的批处理API(BatchWriteItem),以及使用UpdateItem更新单个项的API,但能否在一次调用中更新多个项呢?

9个回答

50

4
2021年12月,五年后,情况仍然如此(不包括使用交易)。 - Ermiya Eskandary
24
2022年3月仍然如此。 - Ron
实际上有一个解决方法可用。请参见@sajed的答案以及我(@ap14)补充的一些信息。 - ap14

30

你知道在调用更新时是否可以提供UPDATE_SKIP_NULL_ATTRIBUTES标志,还是它会删除所有空属性的值? - Arpit
7
这个方法可行,但是使用它的人需要注意交易费用会是普通更新的两倍。 - Wildhammer
值得注意的是:事务不允许返回值。 在我的使用情况中,我想要做的是增加一些计数器 - 这将需要至少2个操作 transact write + transact read - 这并不理想。 - Myxoh

11

我找到了一个类似问题的帖子,希望这可以帮到你。

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)

这是最小的代码。你可以使用多线程同时执行多个批次。


2
我想知道它的性能如何与逐个执行“update_item”相比? 2倍加速? 10倍?更慢? - John Mee
在执行UPDATE操作时,BatchExecuteStatement不支持upserts。 - undefined

8

4
您的回答可以通过添加更多支持信息来改善。请编辑以添加进一步的细节,例如引用或文献,以便他人可以确认您的答案是否正确。您可以在帮助中心中找到更多有关如何撰写良好答案的信息。 - Community
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - Tyler2P
在执行UPDATE操作时,BatchExecuteStatement不支持upserts。 - undefined

2

当使用PartiQL进行更新时,还存在批量更新功能,https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#batchExecuteStatement-property 显然,这允许更新多达25个单个项目。 此外,https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.update.html。 - Marvin

2

2
我使用 DynamoDBMapper.batchSave(Iterable<? extends Object> objectsToSave) 实现此目的。

4
batchSave 方法使用 AmazonDynamoDB.batchWriteItem 方法进行一次或多次调用,将对象保存到一个或多个表中。该方法不提供事务保证。 - bagi

0

我使用了DynamoDB更新触发器,然后创建了一个模板来告诉我应该修改哪些项目,将它们放入队列中,然后按顺序读取队列消息以逐一进行更新。


0

虽然不完全是批量删除,但我刚刚在 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",
    ...

只需用您的 ID、表名、修改表达式和新值替换"idList = [...]"、"Your-Table-Name"、"expressionToChange" 和最后 "New_Value"。

此外,您必须为 Lambda 函数授予在 DynamoDB 中“更新项目”的权限,否则将出现错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接