class MyEntity(db.Model):
timestamp = db.DateTimeProperty()
title = db.StringProperty()
number = db.FloatProperty()
db.GqlQuery("SELECT * FROM MyEntity WHERE title = 'mystring' AND timestamp >= date('2012-01-01') AND timestamp <= date('2012-12-31') ORDER BY timestamp DESC").fetch(1000)
这应该在应用引擎上获取 ~600 个实体。在我的开发服务器上,它的行为符合预期,构建 index.yaml,我上传它,在服务器上进行测试,但在应用程序引擎上它不返回任何内容。
Index:
- kind: MyEntity
properties:
- name: title
- name: timestamp
direction: desc
我尝试在数据存储查看器上拆分查询以查看问题所在以及时间戳约束按预期工作。查询在WHERE title = 'mystring'
应该返回一堆实体时不返回任何内容。
我依稀记得大惊小怪的过滤,你必须用属性和运算符之间的空格调用.filter("prop =",propValue)
,但这是一个 GqlQuery,所以它不是那样(我也用 GQL 尝试了这种格式(。
有人知道我的问题是什么吗?
我能想到的一件事:在我的开发服务器上创建新索引并上传之前,我通过 BulkLoader.py 将 MyEntity 实体列表添加到应用程序中。这会有所作为吗?
你写的最后一行可能是问题所在。
实际数据存储中的实体缺少查询所需的索引。
据我所知,当您添加新索引时,App Engine 应该会为您重建索引。 这可能需要一些时间。 您可以检查管理页面以检查索引的状态,并查看它是否仍在构建中。
App Engine SDK 提供的批量加载程序中存在一个小错误 - 基本上自动生成的配置将字符串转换为db.Text
,如果您希望将这些字段编入索引,这并不好。正确的import_transform指令应该是:
transform.none_if_empty(str)
这将指示 App Engine 将上传的字段
db.StringProperty()
。