如何在Google App Engine数据存储中对实体进行大规模更新?是否可以在不检索实体的情况下完成更新操作?
例如,类似于SQL中以下语句的GAE等效方法是什么:
UPDATE dbo.authors
SET city = replace(city, 'Salt', 'Olympic')
WHERE city LIKE 'Salt%';
如何在Google App Engine数据存储中对实体进行大规模更新?是否可以在不检索实体的情况下完成更新操作?
例如,类似于SQL中以下语句的GAE等效方法是什么:
UPDATE dbo.authors
SET city = replace(city, 'Salt', 'Olympic')
WHERE city LIKE 'Salt%';
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,则这将自动处理。
不,如果不检索实体,就无法完成。
没有所谓的“1000个最大记录限制”,但是任何单个请求都有超时时间 - 如果您需要修改大量实体,则简单的迭代可能会遇到问题。您可以通过将其拆分为多个操作并使用查询游标进行跟踪来管理此操作,或者可能通过使用MapReduce框架来解决。
在处理此请求时,处理该请求的进程使用了过多的内存,并被终止。
- Nate Anderson您可以使用查询类,http://code.google.com/appengine/docs/python/datastore/queryclass.html
query = authors.all().filter('city >', 'Salt').fetch()
for record in query:
record.city = record.city.replace('Salt','Olympic')