当前位置:  开发笔记 > 编程语言 > 正文

Google App Engine数据存储区中的批量更新

如何解决《GoogleAppEngine数据存储区中的批量更新》经验,为你挑选了2个好方法。

在Google App Engine数据存储区中对实体执行批量更新的正确方法是什么?可以在不必检索实体的情况下完成吗?

例如,在SQL中,GAE等同于这样的东西:

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

Drew Sears.. 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和yield puts,则会自动处理.



1> Drew Sears..:

没有直接的翻译.数据存储区确实没有更新的概念; 您所能做的就是用同一地址(密钥)的新实体覆盖旧实体.要更改实体,您必须从数据存储区中获取它,在本地修改它,然后将其保存回来.

也没有与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和yield puts,则会自动处理.



2> Daniel Rosem..:

不,没有检索实体就无法完成.

没有"1000最大记录限制"这样的东西,但任何一个请求当然都有超时 - 如果你有大量的实体要修改,一个简单的迭代可能会违反这一点.您可以通过将其拆分为多个操作并使用查询游标跟踪,或者可能通过使用MapReduce框架来管理它.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有