2012-08-23 32 views
0

當我在查詢上使用fetch_async()時,它首次運行時會與AssertionError一起崩潰。如果我立即再次運行它,那很好。異步查詢首次拋出AssertionError(AppEngine,NDB)

例如,

搭配示範:

class User(ndb.Model): 
    user = ndb.UserProperty() 
    name = ndb.StringProperty() 
    penname = ndb.StringProperty() 
    first_login = ndb.DateTimeProperty(auto_now_add=True) 
    contact = ndb.BooleanProperty() 

下面的作品馬上,並返回一個空列表:

users = User.query(User.penname == "asdf").fetch() 

但這種崩潰:

future = User.query(User.penname == "asdf").fetch_async() 
users = future.get_result() 

有了:

Traceback (most recent call last): 
    File "/opt/google-appengine-python/google/appengine/ext/admin/__init__.py", line 320, in post 
    exec(compiled_code, globals()) 
    File "<string>", line 6, in <module> 
    File "/opt/google-appengine-python/google/appengine/ext/ndb/tasklets.py", line 320, in get_result 
    self.check_success() 
    File "/opt/google-appengine-python/google/appengine/ext/ndb/tasklets.py", line 357, in _help_tasklet_along 
    value = gen.throw(exc.__class__, exc, tb) 
    File "/opt/google-appengine-python/google/appengine/ext/ndb/query.py", line 887, in _run_to_list 
    batch = yield rpc 
    File "/opt/google-appengine-python/google/appengine/ext/ndb/tasklets.py", line 435, in _on_rpc_completion 
    result = rpc.get_result() 
    File "/opt/google-appengine-python/google/appengine/api/apiproxy_stub_map.py", line 592, in get_result 
    return self.__get_result_hook(self) 
    File "/opt/google-appengine-python/google/appengine/datastore/datastore_query.py", line 2386, in __query_result_hook 
    self._batch_shared.conn.check_rpc_success(rpc) 
    File "/opt/google-appengine-python/google/appengine/datastore/datastore_rpc.py", line 1191, in check_rpc_success 
    rpc.check_success() 
    File "/opt/google-appengine-python/google/appengine/api/apiproxy_stub_map.py", line 558, in check_success 
    self.__rpc.CheckSuccess() 
    File "/opt/google-appengine-python/google/appengine/api/apiproxy_rpc.py", line 156, in _WaitImpl 
    self.request, self.response) 
    File "/opt/google-appengine-python/google/appengine/api/datastore_file_stub.py", line 568, in MakeSyncCall 
    response) 
    File "/opt/google-appengine-python/google/appengine/api/apiproxy_stub.py", line 87, in MakeSyncCall 
    method(request, response) 
    File "/opt/google-appengine-python/google/appengine/datastore/datastore_stub_util.py", line 2367, in UpdateIndexesWrapper 
    self._UpdateIndexes() 
    File "/opt/google-appengine-python/google/appengine/datastore/datastore_stub_util.py", line 2656, in _UpdateIndexes 
    self._index_yaml_updater.UpdateIndexYaml() 
    File "/opt/google-appengine-python/google/appengine/datastore/datastore_stub_index.py", line 244, in UpdateIndexYaml 
    all_indexes, manual_indexes) 
    File "/opt/google-appengine-python/google/appengine/datastore/datastore_stub_index.py", line 85, in GenerateIndexFromHistory 
    required, kind, ancestor, props, num_eq_filters = datastore_index.CompositeIndexForQuery(query) 
    File "/opt/google-appengine-python/google/appengine/datastore/datastore_index.py", line 424, in CompositeIndexForQuery 
    assert filter.property(0).name() == ineq_property 
AssertionError 

但是,如果我再這樣做立即運行,例如:

future = User.query(User.penname == "asdf").fetch_async() 

try: 
    users = future.get_result() 
except: 
    users = future.get_result() 

它的工作原理。

這已經出現在各地,我正在努力尋找根本原因。

+0

我注意到,每隔一次又一次,本地Datastore Viewer也會這樣做。我還沒有在活服務器上嘗試過這些,所以它可能是開發服務器的問題? – rhiaro

+0

您使用的是哪個版本的SDK?這聞起來像一個錯誤。關於NDB期貨的兩件事情:(a)它不可能是q.fetch()和q.fetch_async()。get_result()之間的區別,因爲前者只是調用後者。 (b)如果您在SAME Future對象上調用get_result()兩次時會得到不同的結果,因爲第二個get_result()應該僅返回緩存的(在Future對象本身上)返回值呼叫。如果您尚未使用1.7.1 SDK,請升級。如果你是,我建議提交一個錯誤。 –

+0

好的,謝謝,我現在正在升級。 – rhiaro

回答

2

解決方案是升級到1.7.1 SDK。

+0

你可以接受你自己的答案! –

+0

另外21個小時.. – rhiaro