谷歌应用引擎数据存储唯一ID
在Google App Engine上,我想为一个数据表创建一个唯一的键。根据这个链接的建议,我正在尝试以下操作:
假设我有一个叫做Message的模型,字段值是从一个网页获取的,如下所示:
message = db.Message()
message.name = self.request.get('name')
message.email = self.request.get('email')
...
message.put()
message.messageId = message.key().id()
message.put()
我有两个问题:
这样创建唯一的ID(messageId)是对的吗?我的意思是:先放入实体,获取它的ID,然后再赋值给messageId,最后再放回去?这看起来有点奇怪。
如何防止并发问题?我知道我可以使用'事务',如下所示:
@db.transactional def storeEntity(): message.name = self.request.get('name') message.email = self.request.get('email') ... message.put() message.messageId = message.key().id() message.put()
但是如果这个事务失败了,我该怎么做才能一直尝试直到成功呢?提前谢谢你。
1 个回答
1
当你不提供一个键的时候,数据存储系统会自动给你生成一个键,这样你就不需要把实体(数据)写两遍。而且,存储数据的操作会返回这个键。
所以你可以:
message_key = Message(name = self.request.get('name'), email : self.request.get('email')).put()