1

爲什麼當它們沒有父(它們是根實體)時,同一實體組中沒有同類實體?這是否意味着,如果我想從MySQL的數據寫入例如批量操作做HRD:爲什麼同一實體組中不存在同一種類的實體

db.put([Person(name=person.name) for person in cursor.execute("SELECT * FROM person")]) 

,我必須使用事務出於這個原因:

注:批處理調用數據庫.put()或db.delete()可能對一些實體而不是其他實體成功。如果調用完全成功或完全失敗很重要,則必須使用事務,並且所有受影響的實體必須位於同一個實體組中。

來源:https://developers.google.com/appengine/docs/python/datastore/entities#Batch_Operations

我需要建立一個共同的根源主密鑰,它不存在,因爲只有用於交易的目的真正的實體?

parent_key = db.Key.from_path('Human', 'human') 
db.put([Person(parent=parent_key, name=person.name) for person in cursor.execute("SELECT * FROM person")]) 

回答

2

相同類型的實體並不隱含在同一個實體組中,因爲它通常會給大多數用例帶來可怕的性能。

雖然不完全準確,但您可以將實體組視爲控制分片的一種方法。同一組中的實體存儲在物理上接近(即在同一服務器上),允許所有實體以事務方式運行,但也限制該實體組的性能。實體組內的父關係不限於種類,父實體不必與兒童同類。

大多數情況下,實體組將包含不同類型的各種實體,這些實體在邏輯上屬於一起,因爲事務往往基於組。例如,帳戶可能是一堆交易的父項,或者BlogPost可能是一堆評論的父項。

將同一家族中的所有實體置於同一家長下方,可以防止他們真正需要進行交易的其他業務的適當父級。

就你而言,最好不要在事務中運行該操作,並有額外的代碼來處理故障情況。

+0

*就您的情況而言,最好不要在事務中運行該操作,並且需要額外的代碼來處理失敗情況。*我正在查看put操作的API:https://developers.google.com/appengine/docs/ python/datastore/functions#put,它確實表示如果某些實體失敗,可以捕獲該異常:*如果在操作過程中發生任何錯誤,即使某些實體已被寫入,也會始終引發異常。如果調用返回時沒有引發異常,那麼所有的實體都寫成功了。但是,您如何知道應該重複哪些實體? –

+0

@Jernej:你沒有。這就是爲什麼GAE文檔說你在事務中的操作應該是_idempotent_(即重複操作產生相同的結果)。 –

1

不,種類和父母是關鍵的兩個不同部分。完整的密鑰實際上由應用程序ID(隱式設置),名稱空間ID,父鍵(根的所有父鍵)以及名稱或ID組成。

如果您省略父項,那麼實體是實體組的根,並且是此實體組中唯一的實體。

在您的情況下,一批Person實體不會構成一個實體組,而是每個Person(從事務的立場)在其實體組中。所以你的批處理不會是原子的。

注意:實體組是一個名爲「讓我們把所有這些實體放在同一臺機器上」的名字。

注2:現在有新的Cross-Group transactions,它使您能夠跨5個不同的實體組進行交易。

+0

*在你的情況下,一批Person實體並不構成一個實體組,而是每個Person都在它自己的實體組中(從事務的角度來看)。*我認爲放在HRD中的每個Person都在它是自己的交易。但是所有Person實體都應該屬於一個實體組,因爲它們都具有相同的父級?所以如果我把5人放在一起,我會有5筆交易? –

+0

首先你必須明確地使用交易,如果你想要它們。其次,從你的代碼我沒有看到'Person'有父集。 –

+0

查看第二個片段,是否沒有設置父項:db.put([Person(parent = parent_key,name = person.name)for cursor.execute(「SELECT * FROM person」)]) –

相關問題