【问题标题】:Google App Engine NDB custom key idGoogle App Engine NDB 自定义键 ID
【发布时间】:2012-10-15 00:44:36
【问题描述】:

当我使用 ndb 的 put 方法创建对象时,它会自动创建类型为 Key(kind, id) 的键,其中 id 是一个数字。在整个文档中,它显示您可以使用字符串作为键的 id,但我不知道如何在创建对象时自动执行此操作。

我有一个用户模型,我正在考虑使用用户的用户名(因为它是唯一的)作为键的 ID,以便更快地检索。这甚至是个好主意吗?自从用户提交(我正在验证输入)以来,我会对用户名有任何问题吗?

【问题讨论】:

    标签: python google-app-engine app-engine-ndb djangoappengine


    【解决方案1】:
    class UserModel(ndb.Model):
      ...
    
    user_model_entity = UserModel(id='some_string', ...)
    

    如果这些 ID 可能会发生变化,这可能是个坏主意。如果它是您自己的系统并且您可以对潜在的更改做出反应,这是一个好主意,但您需要确保 ID 是唯一的且相对稳定,然后再决定使用它们。

    【讨论】:

    • 我之前遇到过这种方法的延迟问题。为 Datastore 实体手动设置 ID 不是一个好主意,因为您还会遇到“热平板电脑”的问题。最好让数据存储区自动生成实体 ID,而不是将数据编码到密钥本身。而是在实体中使用属性。将关系数据库约定应用于数据存储区可能很诱人,例如自动递增主键,但这实际上会撤消键空间的分片并产生问题。 [1]cloud.google.com/appengine/articles/handling_datastore_errors
    【解决方案2】:

    您在创建时指定实体的 ID。定义模型时,您不会在此处设置 id 属性。因此,例如,您有:

    class User(ndb.Model):
        # fields here
    

    当您创建模型时,您有:

    user = User(id='username', ...)
    

    由于用户名是唯一的并且您验证了您的输入,因此您不会遇到任何问题。

    有关ndb Model 构造函数的更多信息,您可以查看NDB Model Class - Constructor

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您还可以为模型实体提供整数 ID(不一定是字符串)。

      class User(ndb.Model):
      ...
      
      user = User(id=1234567890, ...)
      user.put()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 1970-01-01
        相关资源
        最近更新 更多