14

Python を使用して Google App Engine でアプリケーションを実行しています。モデル クラスは ndb (google.appengine.ext.ndb) クラスから拡張されます。

私のビューの 1 つは、多かれ少なかれ次のようなデータベースへの非同期呼び出しを行います。

# 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
4

2 に答える 2

1

アップデート:

行を削除すると、次のことがわかりました。

exercise_log_query = exercise_log_query.filter(ExerciseListLog.content.IN(contents))

それはうまくいくでしょう。

したがって、エラーはデータベースへの非同期呼び出しとは関係ありません。これは、Google AppEngine がクエリごとに 1 つのフィールドでのみ不等式フィルタをサポートするために発生します。どうやら "content.IN" の使用は、許可されていない 2 番目の不等式としてカウントされます。

そのエラーメッセージはもっと良いかもしれません。


アップデート:

Guido は正しく、上記の私の説明は間違っていることがわかりました。content.IN はcontents空ではありません。

于 2013-03-20T19:08:24.683 に答える