令人惊讶的是,在做了很多查询之后没有问题。我遇到了第一个奇怪的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
答案 0 :(得分:3)
首先没有清楚地描述是我的坏事。如果其他人遇到同样的问题,我将分享解决方案以防万一。
造成这种情况的根本原因是我对App Engine索引的了解不足。早些时候,'type'属性没有索引,因为我没有计划在最近的需求发生变化之前对其进行过滤。
因此,我从属性定义模型索引'type'属性,如问题所示。但是,'type'属性仍然没有编入索引,原因是Indexing Formerly Unindexed Properties:
如果您使用未编入索引的属性创建了现有记录,则即使在更改实体(类)定义以使属性再次编入索引之后,该属性仍将继续为这些记录编制索引。因此,过滤该属性的查询不会返回这些记录。
所以,解决方案是:
将以前未编入索引的属性编入索引
在Property构造函数中设置indexed = True:
class Person(db.Model):
name = db.StringProperty()
age = db.IntegerProperty(indexed=True)
获取每条记录。
所以,从问题来看,我的GQL没有任何问题。这完全是因为“类型”属性仍然没有索引。无论如何,仍然非常感谢@Adam Crossland的一些见解和建议。