【问题标题】:AppEngine: Query datastore for records with <missing> valueAppEngine:查询数据存储以获取具有 <missing> 值的记录
【发布时间】:2009-02-28 20:16:28
【问题描述】:

我在 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'值的Logo记录? 我试过了

logos.filter("is_approved = ", None)

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 来自 Google 的 Marzia 已确认无法查询缺失值。
    【解决方案2】:

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

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

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

    比较的右侧可以是以下之一(如 适用于属性的数据类型):[...] 布尔文字,如 TRUE 或 错误的; NULL 字面量,表示空值(None in 蟒蛇)。

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

    【讨论】:

    • 如果在创建实体时它是模型的一部分,则该字段不会丢失。它是在创建时填充的,即使它填充了 None 或空字符串。
    • Null 为空,!= 缺失。它实际上在数据存储区和索引中都占用了空间!
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多