【问题标题】:GQL test for null IntegerProperty空 IntegerProperty 的 GQL 测试
【发布时间】:2010-11-21 12:55:28
【问题描述】:

我正在尝试查询 Google App 引擎中 IntegerProperty 为空(无)的记录。这是我尝试但没有成功的方法:

data = db.GqlQuery("SELECT * FROM MyModel WHERE intProp=:1",None)

还有一个查询:

query = db.Query(MyModel)
query = query.filter('intProp', None) 
data = query.fetch(limit=100)

任何帮助将不胜感激。

class MyModel(db.Model):
    intProp = db.IntegerProperty()

【问题讨论】:

    标签: null gql


    【解决方案1】:

    您的代码看起来正确。您实际上是否有任何 MyModel 实例与 intPropNone...?

    编辑:根据 OP 的评论,这显然是架构迁移的问题;他添加了一个新属性并期望现有实体出现(设置为无)。根据the docs,这不是 GAE 中架构更改的工作方式:

    App Engine 数据存储区不 要求所有实体具有相同的 一组属性。在更新您的 添加新属性的模型,现有的 实体将继续存在 没有这些属性。在一些 情况,这很好,你 不需要做更多的工作。什么时候 你想回去更新吗 现有实体,因此他们也有 新属性?一种情况 将是当您想要进行查询时 基于新属性。在我们的 图片示例,查询如 “最受欢迎”或“最不受欢迎” 不会返回现有图片, 因为他们(还)没有 评级属性。为了解决这个问题,我们将 需要更新现有实体 在数据存储中。

    我引用的文章继续展示了一种方法,但这是一种相当老式的方法,在 GAE 还没有计划任务、远程 API 等之前。我们现在可以做得更好。 App Engine Fan 有一个最近的post 显示了一般方法(以及他在自己的架构迁移过程中犯的一个错误,以便其他人可以避免它!),并指出remote API 作为关键工具;他还指出了a module(来自 Rietveld 开源核心审查项目,由 Python 的作者和 App Engine 开发的主要贡献者 Guido van Rossum 发起),它巧妙地完成了任务(你需要稍微调整一下代码,让它使用你的模型 &c 而不是 Rietveld 的,当然)。

    【讨论】:

    • 我已将 intProp 作为新属性添加到模型中。我有 MyModel 的实例,但 intProp 不包含数据。也许新属性没有分配无?
    • 对,当您更改架构时,系统本质上不会遍历所有现有实体,修改它们并将它们保存回来;如果你有很多,那可能会非常昂贵。您需要自己管理架构迁移。见code.google.com/appengine/articles/update_schema.html
    【解决方案2】:

    我设法使用这样的技巧查询具有 NULL 值的实体:

    SELECT * FROM MyModel WHERE intProp

    自然无法保证这种未记录的方法与未来版本兼容。

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 1970-01-01
      • 2019-10-27
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多