23

我在 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)

但它没有用。在数据查看器中,新字段值显示为 。

4

3 回答 3

36

根据关于查询和索引的 App Engine 文档,属性没有值的实体和属性值为的实体之间存在区别;和“查询永远不会返回没有过滤属性的实体”。所以不可能为这些旧记录编写查询。

一篇有用的文章是更新你的模型的架构,它说目前唯一支持的查找缺少某些属性的实体的方法是检查所有实体。这篇文章的示例代码展示了如何在大量实体中循环并更新它们。

于 2009-03-01T00:26:57.657 回答
0

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

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

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

比较的右侧可以是以下之一(根据属性的数据类型而定): [...] 布尔文字,如 TRUE 或 FALSE;NULL文字,表示空值(Python 中的 None)。

我不确定“null”是否与“missing”相同:在我的情况下,这些字段已经存在于我的模型中,但在创建时没有填充。也许 Federico 您可以让我们知道 NULL 查询是否适用于您的特定情况?

于 2011-12-22T05:49:05.687 回答
0

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

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

于 2021-03-20T13:52:23.170 回答