我正在将应用程序从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之间行为的细微差别吗?
答案 0 :(得分:3)
这是AppScale中的一个错误,我们使用提供的祖先的完整路径,而不仅仅是复合查询的根实体。它的修复程序可以在这里找到: https://github.com/AppScale/appscale/pull/1633