GQL Query的意外空结果

时间:2012-05-17 14:14:23

标签: python google-app-engine gql gqlquery

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

以下是名为Feedback的模型的属性:

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中(默认值= 1,required = False,indexed = True),并且有8行反馈数据,类型为整数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

1 个答案:

答案 0 :(得分:3)

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

造成这种情况的根本原因是我对App Engine索引的了解不足。早些时候,'type'属性没有索引,因为我没有计划在最近的需求发生变化之前对其进行过滤。

因此,我从属性定义模型索引'type'属性,如问题所示。但是,'type'属性仍然没有编入索引,原因是Indexing Formerly Unindexed Properties:

  

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

所以,解决方案是:

将以前未编入索引的属性编入索引

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

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

  3. 放上每条记录。 (您可能需要在放置之前更改记录中的某些内容,例如时间戳,以便进行写入。)
  4. 所以,从问题来看,我的GQL没有任何问题。这完全是因为“类型”属性仍然没有索引。无论如何,仍然非常感谢@Adam Crossland的一些见解和建议。