Google App Engine Datastore中的批量更新

12

如何在Google App Engine数据存储中对实体进行大规模更新?是否可以在不检索实体的情况下完成更新操作?

例如,类似于SQL中以下语句的GAE等效方法是什么:

UPDATE dbo.authors
SET    city = replace(city, 'Salt', 'Olympic')
WHERE  city LIKE 'Salt%';
3个回答

9
没有直接的翻译。数据存储实际上没有更新的概念;你只能用一个新实体覆盖旧实体,地址(键)相同。要更改实体,必须从数据存储中获取它,本地修改,然后保存回去。
还没有类似于LIKE运算符的等价物。虽然通配符后缀匹配是可能的,但如果您想匹配'%Salt%',则必须将每个实体读入内存并在本地进行字符串比较。
因此,它不会像SQL那样干净或高效。这是大多数分布式对象存储的权衡,数据存储也不例外。
话虽如此,映射器库可用于促进此类批量更新。按照示例并使用以下内容作为process函数:
def process(entity):
  if entity.city.startswith('Salt'):
    entity.city = entity.city.replace('Salt', 'Olympic')
    yield op.db.Put(entity)

除了mapper之外,还有其他选择。最重要的优化技巧是批量更新,不要单独保存每个已更新的实体。如果您使用mapper和yield puts,则这将自动处理。


Drew- 非常感谢你提供的映射器参考资料- 看起来这是我想要学习的东西。 - Yarin

5

不,如果不检索实体,就无法完成。

没有所谓的“1000个最大记录限制”,但是任何单个请求都有超时时间 - 如果您需要修改大量实体,则简单的迭代可能会遇到问题。您可以通过将其拆分为多个操作并使用查询游标进行跟踪来管理此操作,或者可能通过使用MapReduce框架来解决。


丹尼尔感谢-..我曾经认为有一个最大记录限制-他们取消了吗? - Yarin
在我的情况下,我并没有得到一个明确的“超时”错误,而是得到了具体的错误信息:在处理此请求时,处理该请求的进程使用了过多的内存,并被终止。 - Nate Anderson
请允许我强调,MapReduce旨在解决“过多内存”(又称为大型)和“超时”(又称为长时间运行)这两个问题:它非常适用于无法在单个请求范围内处理的大型、长时间运行的作业,例如: - Nate Anderson

2

2
谢谢,但这不是将所有对象都带入内存,并且受到1000个最大记录限制的约束吗? - Yarin

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