我正在努力与KeyProperty查询,并不能看到有什么问题。ndb通过KeyProperty查询
我的模型是
class MyList(ndb.Model):
user = ndb.KeyProperty(indexed=True)
status = ndb.BooleanProperty(default=True)
items = ndb.StructuredProperty(MyRef, repeated=True, indexed=False)
创建MYLIST的实例与相应的数据,并可以运行下面的正确
cls = MyList
lists = cls.query().fetch()
返回
[MyList(key=Key('MyList', 12), status=True, items=..., user=Key('User', 11))]
但它失败时,我尝试按用户进行过滤,即查找用户等于特定实体的列表;即使使用我刚刚用于插入的一个,或从前一个查询结果。
key = lists[0].user
lists = cls.query(cls.user=key).fetch()
返回
[]
但工作正常status=True
作为过滤器,我看不到缺少了什么?
我要补充它在一个单元测试环境将发生在以下v3_stub
self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(probability=0)
self.testbed.init_datastore_v3_stub(
require_indexes=True,
root_path="%s/../"%(os.path.dirname(__file__)),
consistency_policy=self.policy
)
这是最终一致性的产物。它在SDK中被模拟,并且在使用SDK进行测试时,您有几个关于如何模拟的选择。事实证明,你知道你可以检索实体,所以它存在。关闭开发环境中最终的一致性作为另一项检查。但是你必须在你的设计中处理这个问题。 –
@TimHoffman:这是正确的,如果我设置概率= 1,它工作正常,谢谢!然而,我不明白为什么query()w/o参数可以工作,还有另一个过滤器(例如status = True)。这是否意味着,由于最终一致性,索引尚未创建?我认为最终一致性状态是“全部或全部”,而不是“中间”,就像在这种情况下,只有一些索引返回正确的数据。这是一个错误? – apassant
我相信每个索引都可以在自己的时间更新。但是,您正在使用SDK,它至多是真实环境的近似值。您应该编写代码来处理SDK最终的行为,因为这可能是最糟糕的情况。如果你的设计可以解决这个问题,那么你可以处理生产。另一方面,如果您的设计只在设定概率= 1时才起作用,那么您处于滑坡并且在生产中会遇到问题。 –