【问题标题】:BadFilterError: invalid filter: Only one property per query may have inequality filters (<, >=, >, <=)BadFilterError:无效过滤器:每个查询只有一个属性可能有不等式过滤器(<、>=、>、<=)
【发布时间】:2017-09-19 15:27:42
【问题描述】:

我正在尝试在 Python 中编写一个查询,使用 ​​​数据存储 API ​​​​​​​​​​​​​​GPA大于且等于3.2且出生年份小于1998的学生姓名​​​​ 但是,它返回错误:BadFilterError: invalid filter: Only one property per query may have inequality filters (&lt;, &gt;=, &gt;, &lt;=).. 但是,我使用的是文档中提到的方法: https://cloud.google.com/appengine/docs/standard/python/datastore/queryclass#Query_filter https://cloud.google.com/appengine/docs/standard/python/datastore/queries

代码:

from google.appengine.ext import db
import datetime
import webapp2

class Student(db.Model):
    first_name = db.StringProperty()
    last_name = db.StringProperty()
    gpa = db.FloatProperty()
    birth_year = db.IntegerProperty()

class MainPage(webapp2.RequestHandler):
    def get(self):
        student1 = Student(first_name = 'Alex' ,  last_name = 'Karev', gpa = 3.5 ,  birth_year = 1996 )
        student1.put()
        student2 = Student(first_name = 'Susannah', last_name = 'Walpole',gpa = 3.45, birth_year = 1997 )
        student2.put()

        self.response.write('<p>Student1 entity, key = %s</p>'
                             % student1.key())
        self.response.write('<p>Student2 entity, key = %s</p>'
                             % student2.key())

        q = db.Query(Student)

        q = Student.all()

        q.filter('gpa >', 3.2)
        q.filter('birth_year <', 1998)

        results = q.fetch(5)
        self.response.write('<p>Executing the query with fetch()...</p>')
        for e in results:
            self.response.write('<p>Found result: Last Name=%s'
                                % (e.last_name))

app = webapp2.WSGIApplication([('/', MainPage)], debug=True)

而且,当我使用 GQL 而不是数据存储 API 时,我遇到了同样的错误。 代码:

q = Student.gql('WHERE gpa > 3.2 ' +'AND birth_year < 1998 ' +'ORDER BY gpa ASC, birth_year DESC')

【问题讨论】:

标签: python google-app-engine google-cloud-datastore google-cloud-platform


【解决方案1】:

在使用数据存储的情况下,您不能将多个变量与不等式过滤器一起使用。如果您确实需要,您可以只使用“开始”时间进行过滤,仍然可以获得非常准确的结果。

calitem = self.appointments.filter("begin >= ", start).filter("begin <= ", end).fetch(limit=10)

【讨论】:

  • 我不明白。没有称为“开始”的属性。谢谢
【解决方案2】:
q.filter('gpa >', 3.2)
q.filter('birth_year <', 1998)

这不是一个有效的数据存储查询,因为它有多个不等式过滤器,并返回错误:BadFilterError: invalid filter: Only one property per query may have inequality filters (&lt;, &gt;=, &gt;, &lt;=).. 查询的结果必须全部出现在索引中的连续行上,并且没有可能的索引可以使用连续行完全满足此查询。 所以,我解决了这个问题,只使用q.filter('gpa &gt;', 3.2) 并删除q.filter('birth_year &lt;', 1998),并在打印输出的for 外观中使用if 语句过滤birth_year:

self.response.write('<p>Executing the query with fetch()...</p>')
    count = 0
    for e in q:
        if e.birth_year < 1998:
            self.response.write('<p>Found result: Last Name=%s'
                            % (e.last_name))
            count += 1
        if count > 4:
            break

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多