当没有父项(它们是根实体)时,为什么同一实体组中没有隐式相同类型的实体?这是否意味着如果我想做例如从MySQL向HRD写入数据的批处理操作:
db.put([Person(name=person.name) for person in cursor.execute("SELECT * FROM person")])
因为这个原因我必须使用交易:
注意:对db.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")])
答案 0 :(得分:2)
同一类实体并非隐含在同一实体组中,因为它通常会给大多数用例带来可怕的性能。
虽然不完全准确,但您可以将实体组视为控制分片的一种方法。同一组中的实体存储在物理上接近(即在同一服务器上),允许所有实体在事务上操作,但也限制该实体组的性能。实体组中的父关系不限于种类,父实体不必与子类相同。
大多数情况下,实体组将包含不同类型的各种实体,这些实体在逻辑上属于一起,因为事务往往基于组。例如,帐户可能是一堆交易的父级,或者BlogPost可能是一堆评论的父级。
将所有类型的实体放在同一个父级下会阻止它们成为真正需要进行交易的其他操作的正确父级。
在您的情况下,最好不要在事务中运行操作,并且有额外的代码来处理故障情况。
答案 1 :(得分:1)
不,善良和父母是钥匙的两个不同部分。完整密钥实际上包括应用程序ID(隐式设置),命名空间ID,父键(根目录的所有父键)和名称或ID。
如果省略父项,则实体是实体组的根,并且是该实体组中唯一的实体。
在您的情况下,一批Person
个实体不会创建一个实体组,而是每个Person
在其自己的实体组中(从事务的角度来看)。所以你的批量投放不会是原子的。
注意:实体组是“让我们将所有这些实体放在同一台机器上”的奇特名称。
注意2:现在有了新的Cross-Group transactions,可以让您在5个不同的实体组中进行交易。