我正在将应用程序从 Google App Engine 移植到 AppScale,并且在对实体组执行祖先查询时发现了特殊行为。
如果我在父不是根的情况下执行祖先查询,则查询返回零结果。如果我将父级作为 root 执行相同的查询,则会返回正确的结果。
用一个例子最容易说明:
class A(ndb.Model):
name = ndb.StringProperty()
class B(ndb.Model):
name = ndb.StringProperty()
class C(ndb.Model):
name = ndb.StringProperty()
active = ndb.BooleanProperty()
sort = ndb.IntegerProperty()
def main():
a = A(name='I am A')
a.put()
b = B(parent=a.key,
name='I am B')
b.put()
C(parent=b.key,
name='I am C1',
active=True,
sort=0).put()
C(parent=b.key,
name='I am C2',
active=True,
sort=1).put()
C(parent=b.key,
name='I am C3',
active=True,
sort=2).put()
query1 = C.query(C.active == True, ancestor=a.key).order(C.sort).fetch(10)
query2 = C.query(C.active == True, ancestor=b.key).order(C.sort).fetch(10)
print 'query 1 = %s' % len(query1)
print 'query 2 = %s' % len(query2)
如果我在 App Engine 上运行上述代码,我会为这两个查询得到 3 个结果。如果我在 AppScale 上运行它,那么第一个查询只会得到 3 个结果,而第二个查询只会得到 0 个结果。
AppScale 使用 Cassandra 作为数据存储。这是 App Engine 数据存储区和 Cassandra 之间行为的细微差别吗?