谷歌应用引擎数据存储唯一ID

1 投票
1 回答
1600 浏览
提问于 2025-04-17 13:18

在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()

我有两个问题:

  1. 这样创建唯一的ID(messageId)是对的吗?我的意思是:先放入实体,获取它的ID,然后再赋值给messageId,最后再放回去?这看起来有点奇怪。

  2. 如何防止并发问题?我知道我可以使用'事务',如下所示:

    @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()

撰写回答