Google app engine 谷歌应用引擎:一次改变数千个实体?
基本上,我想一次更新大约10000个实体——为每个实体添加一个新的属性和值 鉴于这一类别:Google app engine 谷歌应用引擎:一次改变数千个实体?,google-app-engine,app-engine-ndb,task-queue,Google App Engine,App Engine Ndb,Task Queue,基本上,我想一次更新大约10000个实体——为每个实体添加一个新的属性和值 鉴于这一类别: Post(ndb.Model): title = ndb.StringProperty() created_date = ndb.DateTimeProperty() 我想运行某种操作,在我现有的Post实体中创建这个新的created\u date\u string属性,并用日期的字符串版本占用字段 Post(ndb.Model): title = ndb.StringProp
Post(ndb.Model):
title = ndb.StringProperty()
created_date = ndb.DateTimeProperty()
我想运行某种操作,在我现有的Post
实体中创建这个新的created\u date\u string
属性,并用日期的字符串版本占用字段
Post(ndb.Model):
title = ndb.StringProperty()
created_date = ndb.DateTimeProperty()
created_date_string = ndb.StringProperty(required=True)
我该怎么处理
我的最佳猜测是使用任务队列来更新每个实体;我们将排队处理10000个任务。有更好的方法吗?您可以在单个任务中执行此操作,该任务迭代实体以更新它们。您将希望对get和put进行批处理,以提高效率。任务最多运行10分钟,我打赌这不到一分钟 你确定你需要这个新房子吗?您可以这样做:
Post(ndb.Model):
title = ndb.StringProperty()
created_date = ndb.DateTimeProperty()
@property
def created_date_string(self):
return str(self.created_date)
更新:
我应该解释一下这个令人困惑的术语。这里“财产”有两种完全不同的用法。我的答案中的属性是Python特有的,与GAE无关。Python的@属性
使函数看起来像一个变量,因此可以执行x.created\u date\u string
而不是x.created\u date\u string()
与我上面写的不同,你可以做:
Post(ndb.Model):
title = ndb.StringProperty()
created_date = ndb.DateTimeProperty()
def created_date_string(self):
return str(self.created_date)
这基本上是完全相同的事情
Python属性不同于GAE计算属性,GAE计算属性是数据存储中的实际属性。您也可以使用它,但如果不需要,为什么要存储冗余数据呢。您可以在单个任务中执行此操作,该任务将迭代实体以更新它们。您将希望对get和put进行批处理,以提高效率。任务最多运行10分钟,我打赌这不到一分钟
你确定你需要这个新房子吗?您可以这样做:
Post(ndb.Model):
title = ndb.StringProperty()
created_date = ndb.DateTimeProperty()
@property
def created_date_string(self):
return str(self.created_date)
更新:
我应该解释一下这个令人困惑的术语。这里“财产”有两种完全不同的用法。我的答案中的属性是Python特有的,与GAE无关。Python的@属性
使函数看起来像一个变量,因此可以执行x.created\u date\u string
而不是x.created\u date\u string()
与我上面写的不同,你可以做:
Post(ndb.Model):
title = ndb.StringProperty()
created_date = ndb.DateTimeProperty()
def created_date_string(self):
return str(self.created_date)
这基本上是完全相同的事情
Python属性不同于GAE计算属性,GAE计算属性是数据存储中的实际属性。您也可以使用它,但如果不需要,为什么要存储冗余数据。您正在创建的日期字符串中存储创建的日期属性的版本。我可以想到两个这样做的用例
仅在服务器上使用创建的日期字符串:如果您仅在服务器端使用此属性,则无需存储它,因为它变得多余,您可以通过模型类的实例方法计算它
在API响应中发送创建的日期字符串:如果您通过API发送此属性并在客户端(web/app等)使用它。然后最好的选择是使用Google App Engine的ComputedProperty,如下所示
created_date_string=ndb.ComputedProperty(lambda self:str(self.created_date))
这样,您的created_date_string属性将始终与created_date一致,并将自动创建并存储在数据存储中
您可以找到有关ComputedProperty的更多信息
回到您最初关于如何更新10000个实体的问题。由于这是一项单任务任务,我建议使用不同的。它也使用任务队列,但相对容易使用。如定义中所述:
deferred库允许您通过公开一个简单的函数deferred.deferred()绕过设置专用任务处理程序以及序列化和反序列化参数的所有工作
您可以找到文档。给出的示例本身与您要求的内容同义,即运行批更新
我会这样做的
编写一个专用处理程序(例如:/runbatchupdate),该处理程序将使用不同的
从外部点击处理程序或在cron.yaml中创建一个条目来运行该处理程序
如果您需要一个示例代码,请在下面注释,我将为您编写一个示例处理程序。希望这有帮助您正在将创建的日期属性的版本存储在创建的日期字符串中。我可以想到两个这样做的用例
仅在服务器上使用创建的日期字符串:如果您仅在服务器端使用此属性,则无需存储它,因为它变得多余,您可以通过模型类的实例方法计算它
在API响应中发送创建的日期字符串:如果您通过API发送此属性并在客户端(web/app等)使用它。然后最好的选择是使用Google App Engine的ComputedProperty,如下所示
created_date_string=ndb.ComputedProperty(lambda self:str(self.created_date))
这样,您的created_date_string属性将始终与created_date一致,并将自动创建并存储在数据存储中
您可以找到有关ComputedProperty的更多信息
回到您最初关于如何更新10000个实体的问题。由于这是一项单任务任务,我建议使用不同的。它也使用任务队列,但相对容易使用。如定义中所述:
延迟库允许您通过公开一个简单的函数deferred.defer绕过设置专用任务处理程序以及序列化和反序列化参数的所有工作