八月 07, 2008

对 Google App Engine 中 datastore 的理解

GAE的datastore中,除了一般one-many, many-many的orm关系外
还引入了entities group,key_name, parent等概念(其实我对orm也只是知道点皮毛而已,所以不知道这点是不是GAE的独创)

原来一直觉得这些东西很多余,理解不了
但当使用 Transaction 读写数据时才发现只有同一entities group的entity才可以在一个事务中操作,也就是说所有在一个事务中操作的entity都可以追溯到同一个parent,在datastore关系中,被称为 root

明白了这点,要使用事务,就需要将原来一整套仅仅根据one-many, many-many关系建立的entity加入自己的parent关系(parent只能在entity未提交到datastore前建立,不管有没有制定,entity一旦提交就无法修改)

在建立entities group时,key_name是一个很有用的属性,可以利用key_name建立一个unique的属性,在entities group中快速定位到想要的entity

为了方便使用entities group,我定义了一个Person:
class Person(db.Model):
user = db.UserProperty()
displayName = db.StringProperty()
lastVisted = db.DateTimeProperty(auto_now=True)

在用户登录后,使用
Person.get_or_insert(key_name=user.nickname(), user=user)
为新用户创建属于自己的Person实体,为老用户获取Person实体
然后使用这个entity作为其他与该用户相关的entity的root,就享受GAE datastore的事务处理了

没有评论: