我正在努力與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時才起作用,那麼您處於滑坡並且在生產中會遇到問題。 –