1

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

class A(db.Model):
    a = db.StringProperty()

我添加了布尔字段:

class A(db.Model):
    a = db.StringProperty()
    b = db.BooleanProperty(default=False)

现在我的问题是我想要模型 b == False 的每个实例。

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

干杯

4

2 回答 2

2

我同意@ShayErlichmen。但是,如果您真的想更新每个实体,最简单的方法是使用 MapReduce 库: http ://code.google.com/p/appengine-mapreduce/

这并不像听起来那么容易,因为文档很烂,但这是入门​​点: http ://code.google.com/p/appengine-mapreduce/wiki/GettingStartedInPython

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

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

于 2012-10-12T21:28:31.740 回答
1

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

于 2012-10-12T21:21:15.667 回答