2013-03-20 12 views
12

Google App EngineでPythonを実行しているアプリケーションがあります。 モデルクラスはndb(google.appengine.ext.ndb)クラスから拡張されています。これはget_resultにエラーを投げているndbのGAEでエラー - BadQueryError:FalseNodeを述語に変換できません

# 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 

(): はBadQueryError:私の意見の

一つは次のように多かれ少なかれデータベースへの非同期呼び出し、何かを作る述語FalseNodeを変換できません

しかし、コードをGoogleクラウドにデプロイする場合にのみ発生します。私はそれをローカルで実行すると正常に動作します。

私はこのエラーが何を意味しているのかわかりませんし、Googleでそれを調べることはあまり役に立ちません。 ここに何が間違っているのは誰でも知っていますか?

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

そして、それは動作します:私は行を削除するとことが判明

:ここ

は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 

答えて

22

コンテンツが空リストであると思われます。これはFalseNodeが現れる唯一の理由です。 (もう1つは引数なしでAND()を呼び出しています)。この行を削除すると私の感情が裏付けられているというあなたの見解です。あなたはおそらくこれが起こるとは思わなかったし、あなたのローカルテストではこれは起こりませんでした。おそらく、そのリストにあるコードをデバッグする必要があります。

私は、エラーメッセージが改善する可能性があることに同意します。

+0

あなたが正しいかもしれません。私はあなたの前提をテストし、返信します。ありがとう! –

+3

Guido、あなたは正しいです。この場合、content.INは 'contents'が空でない限り使用できます。ありがとう!! –

1

からの完全なスタックトレースを更新します。

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

そのエラーメッセージが改善する可能性があります。


UPDATE:

それはグイドが正しいと判明し、上記の私の説明が間違っています。 は空ではありません。 content.INが動作しています。

関連する問題