如何在Google App Engine中为Python创建唯一属性?

3 投票
3 回答
1090 浏览
提问于 2025-04-15 16:27

在某些数据库技术中,对于记录中的某个属性,你可以确保这个属性在整个数据库中是唯一的。举个例子,用户记录中的电子邮件地址(email_address)属性。如果把email_address设置为唯一,那么某个特定的电子邮件地址就只能在整个数据库中出现一次。

在谷歌应用引擎中,有没有办法为某个模型设置唯一的属性呢?比如,我能不能有一个用户(User)实体,它的电子邮件属性在整个数据存储中都是唯一的?

我找到了一些资料,可能会对你有帮助,链接在这里:resource here

3 个回答

2

我使用 record.key().id(),在这里有个博客介绍了怎么做,还有Nick Johnson的博客提供了专业的建议。

4

在GAE的数据库中,关于“唯一性”的帮助主要来自于实体的键(key)。不过,我看到你提到的那个网址也注意到了这一点,并展示了一种利用这个特点的方法。如果想要在键之外进行检查,你需要在应用层面进行验证(在你添加一个实体或者修改一组唯一属性之前,先进行一个合适的查询[[只查询键以提高速度]],确保结果是空的),但这样做会比较耗费资源(而且很难保证事务的安全性)。

2

我通过重写put方法并使用key.name实现了这个功能。

class Program(db.Model):
    name = db.StringProperty("Title")
    slug = db.StringProperty("Slug")
    def put(self):
        if Program.get_by_key_name(self.slug):
            raise UniqueConstraintViolation("slug", self.slug)
        self._key_name = self.slug
        return db.Model.put(self)


class UniqueConstraintViolation(Exception):
    def __init__(self, scope, value):
        super(UniqueConstraintViolation, self).__init__("Value '%s' is not unique within scope '%s'." % (value, scope, ))

我把slug保存为key.name,如果你尝试添加另一个程序,它会检查这个key.name是否已经存在。这样做可能不是最好的方法,我也是Python和App Engine的初学者。

这里有一篇不错的文章,讲的是有人使用辅助模型的经验:http://squeeville.com/2009/01/30/add-a-unique-constraint-to-google-app-engine/

编辑:我看到你也提供了那篇文章,哈哈。

撰写回答