【问题标题】:google app engine datastore unique id谷歌应用引擎数据存储唯一 ID
【发布时间】:2013-01-21 16:04:17
【问题描述】:

在 Google App Engine 上,我想为数据表创建一个唯一键。正如this 所建议的那样,我正在尝试执行以下操作:

假设我有一个名为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()
    

但是如果这个交易失败了怎么办?在成功之前我该怎么做?提前致谢。

【问题讨论】:

  • 能否详细说明。您想创建自己的唯一 ID,还是只使用自动生成的 ID?因为在您的代码中,您正在使用已分配的自动生成的 ID 设置属性 messageId。您不需要手动分配它。
  • 是的,我明白了。旧的关系数据库概念:必须有一个主键 ;-)

标签: python google-app-engine


【解决方案1】:

当您不提供密钥时,数据存储区将为您返回一个密钥,因此您不必将实体放置两次。 put 将返回密钥。

所以你可以:

message_key = Message(name = self.request.get('name'), email : self.request.get('email')).put()

【讨论】:

  • 就是这样,谢谢。呃……你对问题2有什么建议吗?
  • 应用引擎使用乐观并发。当交易失败时,您可以选择:自动重试。另请参阅文档:developers.google.com/appengine/docs/python/datastore/… 顺便说一句。最好用ndb代替db,使用实体组强一致性。
  • datastore 为您分配整数 id 并且您不添加重复数据时是否存在并发问题?如果你想在 put 之前预先获取 id,allocate_ids 就是你想要的。
猜你喜欢
  • 2014-10-21
  • 2013-05-17
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多