AppEngine:查询<missing> value </missing>的记录的数据存储

时间:2009-02-28 20:16:29

标签: python google-app-engine google-cloud-datastore

我在Google App Engine数据存储区中为我的数据库模型创建了一个新属性。

旧:

class Logo(db.Model):
  name = db.StringProperty()
  image = db.BlobProperty()

新:

class Logo(db.Model):
  name = db.StringProperty()
  image = db.BlobProperty()
  is_approved = db.BooleanProperty(default=False)

如何查询未设置'is_approved'值的徽标记录? 我试过了

logos.filter("is_approved = ", None)

但它不起作用。 在数据查看器中,新字段值显示为。

3 个答案:

答案 0 :(得分:35)

根据Queries and Indexes上的App Engine文档,对于属性具有 no 值的实体和具有 null 的实体之间存在区别价值;和“没有过滤属性的实体永远不会被查询返回”。因此无法为这些旧记录编写查询。

一篇有用的文章是Updating Your Model's Schema,它说目前唯一支持查找缺少某些属性的实体的方法是检查所有这些属性。本文的示例代码显示了如何遍历大量实体并更新它们。

答案 1 :(得分:1)

也许这已经改变,但我能够根据 null 字段过滤记录。

当我尝试GQL查询SELECT * FROM Contact WHERE demo=NULL时,它只返回缺少演示字段的记录。

根据文件http://code.google.com/appengine/docs/python/datastore/gqlreference.html

  

比较的右侧可以是以下之一(如   适用于属性的数据类型):[...]布尔文字,为TRUE或   假; NULL 文字,表示空值(无   Python)的

我不确定“null”“缺失”相同但是:在我的情况下,这些字段已存在于我的模型中但未填充在创作上。也许Federico你可以让我们知道NULL查询是否适用于你的特定情况?

答案 2 :(得分:0)

一种帮助我们的做法是为每个 Kind 分配一个“版本”字段。这个版本最初在每条记录上设置为 1。如果出现这样的需要(填充大型数据集中的新字段或现有字段),版本字段允许迭代包含“version = 1”的所有记录。通过迭代,为新字段设置“空”或另一个初始值,将版本提升为 2,存储记录,允许使用默认值填充新字段或现有字段。

“版本”字段的好处是选择过程可以继续根据较低的版本号(最初设置为 1)选择尽可能多的会话或所需的时间,直到所有记录都用新字段更新默认值。