3

我正在尝试在 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()
4

2 回答 2

4

您的代码看起来正确。您实际上是否有任何MyModel带有...intProp的实例None

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

App Engine 数据存储区不要求所有实体都具有相同的一组属性。更新模型以添加新属性后,现有实体将继续存在而没有这些属性。在某些情况下,这很好,您无需再做任何工作。您何时想要返回并更新现有实体,以便它们也具有新属性?一种情况是您想要基于新属性进行查询。在我们的图片示例中,像“最受欢迎”或“最不受欢迎”这样的查询不会返回现有图片,因为它们(还)没有评级属性。要解决此问题,我们需要更新数据存储中的现有实体。

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

于 2009-08-21T02:42:07.233 回答
2

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

选择 * 从 MyModel WHERE intProp < 0

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

于 2009-09-07T08:45:17.380 回答