0

令人惊讶的是,在做了很多查询之后没有问题。我遇到了第一个奇怪的 GQL 问题。

以下是称为反馈的模型的属性:

content  date    title   type    votes_count     written_by

在 index.yaml 中配置了以下内容:

- kind: Feedback
  properties:
  - name: type
  - name: date
   direction: desc

当我查询所有按日期排序的反馈数据时,它会返回所有结果:

query = GqlQuery("SELECT __key__ FROM Feedback ORDER BY date DESC")

type属性存储在type = db.IntegerProperty(default=1, required=False, indexed=True)中,共有8行Feedback数据,类型为整数1。

但是,当我查询时:

query = GqlQuery("SELECT __key__ FROM Feedback WHERE type = :1 ORDER BY date DESC", type)

它一直给我返回空的结果。出了什么问题?

更新

def get_keys_by_feedback_type(type_type):
    if type_type == FeedbackCode.ALL:
        query = GqlQuery("SELECT __key__ FROM Feedback ORDER BY date DESC")
    else:
        query = GqlQuery("SELECT __key__ FROM Feedback WHERE type = :1 ORDER BY date DESC", type_type)    
    return query

results = Feedback.get_keys_by_feedback_type(int(feedback_type_filter))
for feedback_key in results:
# iterate the query results

该索引正在服务:

Feedback 
type ▲ , date ▼ Serving
4

1 回答 1

3

一开始没有清楚地描述是我的坏事。如果其他人遇到同样的问题,我将分享解决方案以防万一。

造成这种情况的根本原因是我对 App Engine 索引的了解不足。早些时候,'type' 属性没有被索引,因为我不打算在最近的需求更改之前过滤它。

因此,我从属性定义模型中索引了“类型”属性,如问题所示。然而,'type' 属性仍未被索引,原因解释如下,索引以前未索引的属性:

如果您有使用未索引属性创建的现有记录,则即使您更改实体(类)定义以使属性再次被索引,该属性仍会继续为这些记录未索引。因此,这些记录将不会由对该属性进行过滤的查询返回。

所以,解决方案是:

使以前未编入索引的属性被编入索引

  1. 在 Property 构造函数中设置 indexed=True:

    class Person(db.Model):
        name = db.StringProperty()
        age = db.IntegerProperty(indexed=True)
    
  2. 获取每条记录。

  3. 放每条记录。(您可能需要在放入之前更改记录中的某些内容,例如时间戳,以便写入发生。)

所以,我的 GQL 没有任何问题。这完全是因为“类型”属性仍未被索引。无论如何,仍然非常感谢@Adam Crossland 的一些见解和建议。

于 2012-05-18T12:23:21.003 回答