GQL 查询未返回 StringProperty 查询平等性测试的结果

Posted

技术标签:

【中文标题】GQL 查询未返回 StringProperty 查询平等性测试的结果【英文标题】:GQL Query Not Returning Results on StringProperty Query Test for Equality 【发布时间】:2012-07-23 00:07:54 【问题描述】:
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 实体列表添加到应用程序中。那会有什么不同吗?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

transform.none_if_empty(str)

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

【讨论】:

以上是关于GQL 查询未返回 StringProperty 查询平等性测试的结果的主要内容,如果未能解决你的问题,请参考以下文章

GQL:查找包含子字符串的所有实体

useQuery 返回未定义,但在 gql 操场上返回数据

GQL 按日期选择

无法导入gql

用于传递变量的 GraphQL 查询参数语法

如何在gql查询中添加参数