2015-12-18 93 views
1

NDB allocate_ids有與NDB allocate_ids()這似乎是在NDB模糊區域相當多的問題,但我發現這個問題無處處理。與父母

當使用父/子層次,ids應該是給定父鍵獨特,所以你可以創建

entity_1 = MyEntity(parent=my_parent_key_1, id=23)  
entity_2 = MyEntity(parent=my_parent_key_2, id=23) 

現在,當您需要分配的ID進行明確劃分,靜態函數MyEntity.allocate_ids()以父母爲參數。因此,您將假定帶有父參數的allocate_ids()爲給定的父級保留一定範圍的ID,而不是,對於任何父級

但是:

MyEntity.allocate_ids(max=1000, parent=ndb.Key(MyParentEntity, 'aaa')) 

回報(1L, 1000L)。前1000個ID分配。現在運行:

MyEntity.allocate_ids(max=1000, parent=ndb.Key(MyParentEntity, 'bbb')) 

回報(1001L, 1000L),這意味着第一個可用的ID爲1001L,並沒有什麼新的劃撥,儘管父鍵是不同的。

現在運行:

MyEntity.allocate_ids(max=2000, parent=ndb.Key(MyParentEntity, 'ccc')) 

回報(1001L, 2000L),這意味着1001年至2000年被分配的ID。

因此它似乎allocate_ids實際上是獨立的父鍵。你可能會想知道爲什麼通過parent_key作爲參數。

任何人有對此的解釋,或者可以指向與這種奇怪的行爲文檔?

和相關的問題:有沒有辦法知道什麼ID範圍(或範圍)已通過調用allocate_ids()保留?

+0

剛剛發現它比我想象的更糟糕:ID範圍被分配爲全NDB數據庫,而不是一個給定的實體。從前面的例子,如果我稍後做一個'MyOtherEntity.allocate_ids(100)',我得到(2001L,2100L)。即使它是用於另一個實體,分配的範圍也會跟在先前分配的範圍上。因此,不能有2種不同的實體類型,每種都使用用戶定義的分配的ID,比如1到1000,並且讓Ndb在此範圍之外分配自動ID。相反,第一個實體將獲得1到1000,下一個實體將獲得1001到2000. – patb

+0

我認爲你期望太多看到@daniel的答案。 –

回答

1

我不知道爲什麼這很重要。 allocate_ids的唯一目的是確保GAE不會自動爲實體提供某些ID值,前提是您沒有自己定義完整的密鑰。它什麼都不做;特別是,它不會對你對這些ID做什麼施加任何限制。與您在評論中所說的相反,使用兩個不同實體類型的相同分配ID值肯定沒有什麼可阻止您。

+1

真正重要的是文檔可能會引起誤解,但你是對的:一旦我們知道它是如何工作的,我們就可以忍受。擁有'allocate_ids()'實體模型類的方法確實表明我們正在爲這個類分配ids _。同樣,接受父鍵參數確實表明我們正在爲此parent_分配ids _。但是這兩種說法都不正確,值得了解。儘管如此,我會接受答案,因爲沒有更好的可能會出現。謝謝。 – patb