Python GQL查询的意外空结果

Python GQL查询的意外空结果,python,google-app-engine,gql,gqlquery,Python,Google App Engine,Gql,Gqlquery,令人惊讶的是,在完成了大量的查询之后,没有问题。我遇到了第一个奇怪的GQL问题 以下是称为反馈的模型的属性: content date title type votes_count written_by 在index.yaml中配置了以下内容: - kind: Feedback properties: - name: type - name: date direction: desc 当我查询所有按日期排序的反馈数据时,它会返回所有结果: quer

令人惊讶的是,在完成了大量的查询之后,没有问题。我遇到了第一个奇怪的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(默认值=1,必需值=False,索引值=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

我一开始描述得不清楚,这是不好的。我将分享解决方案,以防万一,如果其他人面临同样的问题

根本原因是我对应用程序引擎索引的了解不足。早些时候,“type”属性没有索引,因为在最近的需求更改之前,我不打算过滤它

因此,我从属性定义模型中为“type”属性编制了索引,如问题所示。但是,由于本文解释的原因,“type”属性仍然未编制索引

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

因此,解决办法是:

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

  • 在属性构造函数中设置indexed=True:

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

  • 把每一张唱片都放进去。(您可能需要在put之前更改记录中的某些内容,例如时间戳,以便进行写入。)

  • 所以,我的GQL从问题的所有方面都没有问题。这都是因为“type”属性没有索引。无论如何,还是要感谢@Adam Crossland提供的一些见解和建议。

    我一开始描述得不清楚,这是我的错。我将分享解决方案,以防万一,如果其他人面临同样的问题

    根本原因是我对应用程序引擎索引的了解不足。早些时候,“type”属性没有索引,因为在最近的需求更改之前,我不打算过滤它

    因此,我从属性定义模型中为“type”属性编制了索引,如问题所示。但是,由于本文解释的原因,“type”属性仍然未编制索引

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

    因此,解决办法是:

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

  • 在属性构造函数中设置indexed=True:

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

  • 把每一张唱片都放进去。(您可能需要在put之前更改记录中的某些内容,例如时间戳,以便进行写入。)

  • 所以,我的GQL从问题的所有方面都没有问题。这都是因为“type”属性没有索引。无论如何,非常感谢@Adam Crossland提供的一些见解和建议。

    尝试使用
    类型之外的内容作为变量名;这是Python提供的一个函数,虽然没有什么可以阻止您将其更改为其他函数(Python非常动态),但您确实应该不惜一切代价避免这样做。此外,如果您显式使用数字
    1
    而不是变量,则查询是否会返回结果?哈哈……在您要求我更改“type”变量之后,我明确尝试将1作为查询,但在执行return query.count(limit=1)时仍然返回空结果。还有其他建议吗?也许我再次尝试部署以双重确认,以下是我尝试的更多内容。我查询了投票计数和类型属性,并且都返回了空结果。我真的不知道出了什么问题(您确定您的数据存储中仍有数据吗?使用开发服务器,每次启动时,本地数据存储可能会重新创建为空。请尝试使用
    类型
    以外的内容作为变量名;它是Python提供的一个函数,尽管没有什么可以阻止您将其更改为其他内容(Python是非常动态的)您真的应该不惜一切代价避免这样做。另外,如果显式使用数字
    1
    而不是变量,查询是否返回结果?哈哈……在您要求我更改“type”变量后,我显式尝试将1作为查询,但在执行return query.count时仍然返回空结果(limit=1)还有其他建议吗?也许我再次尝试部署以双重确认我尝试了更多。我查询了投票计数和类型属性,并且都返回了空结果。我真的不知道哪里出了问题:(您确定您的数据存储中仍有数据吗?对于开发服务器,每次启动时都可能会重新创建空的本地数据存储。