我有一个使用python在Google App Engine上运行的应用程序。 模型类从ndb(google.appengine.ext.ndb)类扩展。
我的一个观点会对数据库进行异步调用,或多或少会像:
# ExerciseListLog is a ndb model class
# start_current, end_current are dates
# student_id is a string
# contents is a list of keys
exercise_log_query = ExerciseListLog.query(ndb.AND(ExerciseListLog.creation >= start_current,
ExerciseListLog.creation < end_current,
ExerciseListLog.user_id == student_id))
exercise_log_query = exercise_log_query.filter(ExerciseListLog.content.IN(contents))
future = exercise_log_query.count_async()
count = future.get_result() # this throws BadQueryError
这会在get_result()上抛出错误: BadQueryError:无法将FalseNode转换为谓词
但只有在我将代码部署到Google云时才会发生这种情况。当我在本地运行它时工作正常。
我不知道这个错误意味着什么,在Google上查找它并没有多大帮助。 谁知道这里有什么问题?
这是来自GAE日志的完整堆栈跟踪
Traceback (most recent call last):
File "/base/data/home/apps/s~qmagtest/1.366092357976105290/zen/web/gae/convention.py", line 48, in make_convention
method(*args, **kwargs)
File "/base/data/home/apps/s~qmagtest/1.366092357976105290/core/web/qmhandler.py", line 48, in wrapper
return method(self, *args, **kwargs)
File "/base/data/home/apps/s~qmagtest/1.366092357976105290/core/user/login/security.py", line 36, in wrapper
method(self, *args, **kwargs)
File "/base/data/home/apps/s~qmagtest/1.366092357976105290/core/user/security.py", line 17, in wrapper
method(self, *args_inner, **kwargs)
File "/base/data/home/apps/s~qmagtest/1.366092357976105290/plugins/web/desempenho/estatisticas.py", line 127, in class_activities
school_class.content)
File "/base/data/home/apps/s~qmagtest/1.366092357976105290/plugins/web/desempenho/estatisticas.py", line 178, in _get_exercise_video_and_total_weekly_series
exercise_log_count = exercise_count_futures[i].get_result()
File "/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 325, in get_result
self.check_success()
File "/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 371, in _help_tasklet_along
value = gen.send(val)
File "/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/query.py", line 1227, in _count_async
dsquery = self._get_query(conn)
File "/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/query.py", line 873, in _get_query
filters = filters._to_filter()
File "/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/query.py", line 599, in _to_filter
for node in self.__nodes
File "/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/query.py", line 600, in <genexpr>
if isinstance(node, PostFilterNode) == post))
File "/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/query.py", line 425, in _to_filter
'Cannot convert FalseNode to predicate')
BadQueryError: Cannot convert FalseNode to predicate
答案 0 :(得分:22)
我怀疑问题是内容是一个空列表。这几乎是FalseNode出现的唯一原因。 (另一个是没有参数调用AND()。)你观察到删除这条线证实了我的预感。您可能没想到会发生这种情况,并且在本地测试中它从未发生过......您可能需要调试该列表中的代码。
我同意错误信息可能更好。
答案 1 :(得分:1)
更新
我发现如果删除该行:
exercise_log_query = exercise_log_query.filter(ExerciseListLog.content.IN(contents))
然后它会起作用。
因此,该错误与对数据库的异步调用无关。 之所以发生这种情况,是因为Google AppEngine支持每个查询只有一个字段的不等式过滤器。 显然使用“content.IN”算作第二个不等式,这是不允许的。
该错误消息可能更好。
更新:
事实证明Guido是对的,我上面的解释是错误的。
content.IN现在正在使用contents
不为空。