谷歌应用引擎NDB自定义键ID

23

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

我有一个User模型,我想使用用户的用户名(因为它是唯一的)作为键的ID以便更快地检索。这是一个好主意吗?由于它是用户提交的(我正在验证输入),所以我会遇到任何用户名的问题吗?

3个回答

32
class UserModel(ndb.Model):
  ...

user_model_entity = UserModel(id='some_string', ...)
如果这些ID可能会发生变化,那么这可能不是一个好主意。如果这是你自己的系统,并且你可以及时处理潜在的变化,那么这是一个好主意,但在决定使用它们之前,你需要确保ID是唯一且相对稳定的。

我之前使用这种方法时遇到了延迟问题。手动为Datastore实体设置ID并不是一个好主意,因为你也会遇到“热表”问题。最好让数据存储自动生成实体ID,并且不要将数据编码到键本身中。而是在实体中使用属性。可能会诱人将关系数据库约定应用于Datastore,例如自动递增的主键,但这实际上会撤销键空间的分片并创建问题。[1] https://cloud.google.com/appengine/articles/handling_datastore_errors - Daigo Sato

13

创建实体时需要指定其ID。当您定义模型时,不会在此处设置ID属性。因此,例如:

class User(ndb.Model):
    # fields here

创建模型时,你需要:

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

既然用户名是唯一的,并且您验证了输入,那么您在使用此方法时不会遇到任何问题。

要了解有关ndb Model构造函数的更多信息,请查看NDB Model Class - Constructor

希望这可以帮助您。


0

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

class User(ndb.Model):
...

user = User(id=1234567890, ...)
user.put()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接