GQL查询不返回StringProperty查询等于平等的结果

时间:2012-07-23 00:07:54

标签: google-app-engine google-cloud-datastore gql bulkloader

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)

这应该在app引擎上获取~600个实体。在我的开发服务器上,它按预期运行,构建index.yaml,我上传它,在服务器上测试但在应用引擎上它不会返回任何内容。

Index:
- kind: MyEntity
  properties:
  - name: title
  - name: timestamp
    direction: desc

我尝试在数据存储区查看器上拆分查询以查看问题所在,并且时间戳约束按预期工作。当WHERE title = 'mystring'应该返回一堆实体时,查询不会返回任何内容。

我依稀记得那些必须用属性和运算符之间的空格调用.filter("prop =",propValue)的繁琐过滤,但这是一个GqlQuery,所以不是那样的(我也尝试使用GQL格式)。

任何人都知道我的问题是什么?

我能想到的一件事: 在我的devserver&amp;上创建新索引之前,我通过BulkLoader.py将MyEntity实体列表添加到应用程序中。上传。这会有所作为吗?

2 个答案:

答案 0 :(得分:0)

你写的最后一行可能就是问题。

实际真实数据存储区中的实体缺少查询所需的索引。

据我所知,当您添加新索引时,App Engine应该为您重建索引。这可能要花点时间。您可以检查管理页面以检查索引的状态,看它是否仍在构建。

答案 1 :(得分:0)

原来有一个轻微的bug in the bulkloader supplied with App Engine SDK - 基本上自动生成的配置将字符串转换为db.Text,如果你希望这些字段被索引,那就不好了。正确的import_transform指令应为:

transform.none_if_empty(str)

这将指示App Engine将上传的字段编入索引为db.StringProperty()