繁体   English   中英

AppEngine:查询数据存储以获取记录<missing>价值</missing>

[英]AppEngine: Query datastore for records with <missing> value

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

如何查询 Logo 记录,其中没有设置 'is_approved' 值? 我试过

logos.filter("is_approved = ", None)

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM