Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NDB查询生成器不支持';I don’我没有按预期工作_Python_Google App Engine_Google Cloud Datastore_App Engine Ndb_Dev Appserver - Fatal编程技术网

Python NDB查询生成器不支持';I don’我没有按预期工作

Python NDB查询生成器不支持';I don’我没有按预期工作,python,google-app-engine,google-cloud-datastore,app-engine-ndb,dev-appserver,Python,Google App Engine,Google Cloud Datastore,App Engine Ndb,Dev Appserver,我的应用程序中有以下查询 query=cls.query().filter(cls.taskgroup\u id==taskgroup\u id,cls.availability==True,cls.task\u id>min\u task\u id)。顺序(cls.task\u id) query.fetch(1) 以上工作正常。(仅获取与任务组id匹配且可用的实体,并且任务id>最小任务id) 但是,当我将查询分解为多个语句时 query = cls.query() query.filter

我的应用程序中有以下查询

query=cls.query().filter(cls.taskgroup\u id==taskgroup\u id,cls.availability==True,cls.task\u id>min\u task\u id)。顺序(cls.task\u id)
query.fetch(1)

以上工作正常。(仅获取与任务组id匹配且可用的实体,并且任务id>最小任务id)

但是,当我将查询分解为多个语句时

query = cls.query()
query.filter(cls.taskgroup_id == taskgroup_id)
query.filter(cls.availability == True)
query.filter(cls.task_id > min_task_id)
它没有按预期工作

当我运行[2]时,查询结构被分解成多个语句,它会返回一个可用性为False的实体,task_id等于min_task_id

[2] 没有按预期(或我预期)工作。我认为这里有一个用户错误。想知道是什么。

来自(我的):

query=Account.query(Account.userid>=40,Account.userid<50)
[……]

而不是在单个表达式中指定整个查询筛选器, 您可能会发现分步骤进行构建更为方便:例如:

query1=Account.query()#检索所有帐户实体
query2=query1.filter(Account.userid>=40)#用户id上的filter>=40
query3=query2.filter(Account.userid<50)#对userid<50的用户进行筛选
query3
相当于上一个变量中的
query
变量 例如注意查询对象是不可变的,因此
query2
不影响
query1
query3
不影响
query1
query2

换句话说,在您的示例中,
query.filter()
语句实际上都不会修改
query


只需将语句的结果分配给局部变量,并使用它们,就像引用的示例一样。

有趣。不知道查询对象是不可变的。不知道这背后的理由是什么。将结果分配给临时变量(虽然解决了问题),在我看来这很难看(我可能错了,我想这样做是有充分理由的)。例如,它提供了通过有条件地添加一个或多个过滤器(例如,用户可通过GUI配置和选择的过滤器)来构造一个或多个相关查询的能力. 如果查询不是不可变的,那么查询就必须在一个潜在的复杂条件逻辑中从头开始构建——非干性的,更容易出错的IMHO.interest。我想,建议创建临时变量,因为不变性同样容易出错。常见的错误是使用query1而不是query2(query3=query1.filter()而不是query2.filter()。由于这是一个逻辑错误,调试将花费比预期更多的时间。如果它们提供一个可变查询对象会更好,就像Java提供StringBuilder(可变)和String(不可变)一样如果您不打算重用任何中间查询,那么每次只使用相同的变量名。
query = Account.query(Account.userid >= 40, Account.userid < 50)
query1 = Account.query()  # Retrieve all Account entitites
query2 = query1.filter(Account.userid >= 40)  # Filter on userid >= 40
query3 = query2.filter(Account.userid < 50)  # Filter on userid < 50 too