Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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
数据库中的GAE python更新_Python_Google App Engine_Google Cloud Datastore - Fatal编程技术网

数据库中的GAE python更新

数据库中的GAE python更新,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我有一个关于更新GAE数据库中的字段的问题。我的问题是这样的: class A(db.Model): a = db.StringProperty() 我添加了布尔场: class A(db.Model): a = db.StringProperty() b = db.BooleanProperty(default=False) 现在我的问题是,我想让模型b==False的每个实例 为了更新它,我当然可以将它们从数据存储中拖出并放回那里,但是那里已经有700k个元素了,

我有一个关于更新GAE数据库中的字段的问题。我的问题是这样的:

class A(db.Model):
    a = db.StringProperty()
我添加了布尔场:

class A(db.Model):
    a = db.StringProperty()
    b = db.BooleanProperty(default=False)
现在我的问题是,我想让模型b==False的每个实例

为了更新它,我当然可以将它们从数据存储中拖出并放回那里,但是那里已经有700k个元素了,我真的不知道如何有效地做到这一点。我不能立即取出它们,因为我得到了软内存超出的错误。如果我试着用小数据块来做这件事,它会花费我很多的db读取操作。你知道我还能怎样更新我的数据存储吗


干杯

您的新属性可以处于三种状态之一:无、假和真。只要将代码中的None视为False,您就不必进行更新。

我同意@ShayErlichmen。但是,如果确实要更新每个实体,最简单的方法是使用MapReduce库:

这并不像听起来那么简单,因为文档很糟糕,但这是入门要点:

您只需编写一个函数foo(),该函数将检查传递给它的每个实体的值,如果需要,可以编写、更新布尔值并编写它


该库将获取实体的批次,并将每个批次发送到单独的任务。每个任务都将在调用函数foo()的循环中运行。请注意,批处理是并行运行的,因此它可能会并行启动一些实例,但它往往很快。

我恐怕无法真正查询该值。它们不是None,它们缺少编辑:我正在尝试A.all().filter('b=',None).count(),但它给了我0个try A.all().filter('b!=',True)。如果这些700k实体是使用模型类的第一个版本编写的,则无法编写任何查询来仅检索那些根本没有b属性的实体。您最好的选择是架构更改的标准答案:编写一个简单的映射/减少作业。@GuidovanRossum是因为索引没有对旧实体的引用吗?与更新数据存储中的实体相比,重新编制索引的过程不是更便宜吗?事实上,没有索引来索引属性的缺失。数据存储中没有内置的重新索引操作——数据存储不知道何时更改模式(因为模式是动态的),因此无法自动执行此操作。因此,加载和写回每个实体是唯一的方法。当然,您也可以让它们保持原样,然后编写应用程序来处理它(但在查询此属性时必须小心)。