Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 谷歌应用引擎:一次改变数千个实体?_Google App Engine_App Engine Ndb_Task Queue - Fatal编程技术网

Google app engine 谷歌应用引擎:一次改变数千个实体?

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

基本上,我想一次更新大约10000个实体——为每个实体添加一个新的属性和值

鉴于这一类别:

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绕过设置专用任务处理程序以及序列化和反序列化参数的所有工作