异步查询第一次抛出AssertionError(AppEngine,NDB)

时间:2012-08-23 20:50:47

标签: python google-app-engine app-engine-ndb

当我在查询中使用fetch_async()时,它会在第一次运行时与AssertionError崩溃。如果我立即再次运行它,没关系。

例如

使用模型:

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()

有效。

这已经遍布整个地方,我正在努力确定根本原因。

1 个答案:

答案 0 :(得分:2)

解决方案是升级到1.7.1 SDK。