我正在尝试在Google App引擎中查询IntegerProperty为null(无)的记录。这是我尝试没有成功的原因:
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()
答案 0 :(得分:4)
您的代码看起来是正确的。您实际上有MyModel
intProp
None
的任何实例吗?
编辑:根据OP的评论,这显然是架构迁移的问题;他添加了一个新属性,并期望现有实体出现(设置为None)。根据{{3}}
,这不是GAE中架构发生变化的方式App Engine数据存储区没有 要求所有实体都有相同的 一组属性。更新后你的 模型添加新属性,现有 实体将继续存在 没有这些属性。在一些 情况,这很好,你 不需要再做任何工作了。什么时候 你想回去更新吗? 他们也有现有的实体 新物业?一种情况 当你想做一个查询时 基于新属性。在我们的 例如图片,查询等 “最受欢迎”或“最不受欢迎” 不会返回现有的图片, 因为他们(还)没有 评级属性。要解决这个问题,我们会 需要更新现有实体 在数据存储区中。
我所引用的文章继续通过展示一种方法来实现,但这是一种非常老式的方法,从GAE计划任务之前,远程apis,& c。我们现在可以做得更好。 App Engine Fan有一个非常近期的the docs,它显示了一般方法(以及他在自己的模式迁移过程中犯的错误,以便其他人可以避免它!),并指向post作为关键工具;他还指出remote API(来自Rietveld开源核心评论项目,由Python的作者,App Engine开发的主要贡献者Guido van Rossum发起),它可以整齐地完成任务(你''我需要稍微调整一下代码,这样它就会使用你的模型而不是Rietveld的。)
答案 1 :(得分:2)
我设法使用这样的技巧查询具有NULL值的实体:
SELECT * FROM MyModel WHERE intProp< 0
当然,没有任何保证,这种非文档方法将与未来的版本兼容。