python - 无论键或条件如何,如何更新 DynamoDB 表中的属性?
问题描述
我有一个 DynamoDB 表说data
。该表有 400k 项。每个项目有 4 个字段 -
- id (string) 这是我的分区键
- 状态(是/否)
- 添加日期
- 资源
现在所有项目都有一个status
=“Y”。无论密钥或任何条件如何,如何更新所有项目并将所有 400k 项目的状态设置为“N”?
在 MySQL 中,等效的语句是 -
UPDATE data SET status = 'N';
我希望通过命令行或在 python 中使用 boto3 来完成它
解决方案
没有简单或便宜的方法来做你想做的事。您基本上需要做的是读取和写入整个数据库:
写:
- 如果您知道单个项目的密钥,则可以使用of进行
UpdateItem
请求。这只会修改“状态”属性(其余部分保持不变),但您将产生的成本(或您将使用的预置吞吐量)将是编写整个项目的成本。所以所有这些操作的总和将是重写整个数据库的成本。UpdateExpression
"set status = :N"
- 您应该在上面添加
UpdateItem
aConditionExpression
,仅当该项目实际仍然存在时才更新该项目(您可以使用attribute_exists()
其 key 属性上的条件来验证项目是否存在)。这将允许您的工作负载在进行这些更改时删除项目。 - 在开始此更改过程之前,更改您的客户端代码以编写状态 = N 的新项目。更改过程可能会丢失这些新项目,但如果它们已经创建状态 = N 也没关系。
- 您不能使用
BatchWriteItems
(batch_writer()
in boto3) 一起修改一组项目,因为此批量操作只能替换项目 - 不能修改现有项目的属性。在任何情况下, aBatchWriteItems
都不会降低成本(批次成本与它们包含的请求相同)。
阅读:
- 要获取数据库中所有现有键的列表,要进行上述读取,您需要使用一个
Scan
操作,Projection
设置为KEYS_ONLY
仅获取键(您不需要数据)。不幸的是,您的成本将与阅读整个项目相同,而不仅仅是阅读钥匙。所以所有这些 Scan 操作的成本总和将是读取整个数据库。
如果您为此表使用预置容量,则可以使用客户端请求未使用的任何多余容量在后台缓慢地进行此更改,基本上是“免费”的。
这在您的情况下是否有意义实际上取决于您提供了多少过剩容量(读取和写入!)。如果你这样做,你需要注意不要为这个后台操作使用太多容量并伤害你的真实用户 - 你需要有某种控制器来通知容量超出错误并减少容量由后台进程使用。
如果您实际上有很多已经支付的超额预置容量,您可以随心所欲地执行此后台操作!读取部分 aScan
可以尽可能快地并行完成(使用“并行扫描”功能),并且不同键的写入部分显然也可以并行完成。
推荐阅读
- android - 仅在 Kitkat 上运行我的应用程序
- reactjs - 尝试启动反应应用程序后计算机冻结
- angular - 根据路由在组件中加载动态css文件?
- javascript - 如何在不刷新页面的情况下从表中删除一行?
- imagej - 打开文件夹中上一张图片的快捷键
- php - 使用 php 更新数据库中特定 id 的输入详细信息
- kubernetes - 如何使用 kops 在 Kubernetes 中启动一个新节点?
- css - VSCode 中 CSS 的代码折叠
- java - 从activemq连接工厂创建连接时Activemq在启动时失败
- php - 如何将 index.php 重定向到 wordpress 中的其他链接