如何在谷歌应用引擎上的python中创建一个独特的属性?

时间:2009-11-27 16:54:12

标签: python database google-app-engine

在某些数据库技术中,对于记录中的属性,您可以保证整个数据库中该属性的唯一性。此示例可能是用户记录中的email_address属性。通过将email_address设置为unique,您可以保证特定电子邮件地址只能出现在整个数据库的一条记录中。

谷歌应用引擎中是否有任何方式可以为给定模型提供独特的属性?例如,我是否可以拥有一个具有电子邮件属性的用户(db.Model)实体,该属性在整个数据存储区中保证唯一?

我发现了这个resource here,这可能会有所帮助。

3 个答案:

答案 0 :(得分:4)

您从GAE的数据存储中获得的关于“唯一性”的唯一帮助是通过实体的密钥 - 但是,我看到您引用的URL也注意到并显示了利用这一事实的一种方法。要获得除键之外的任何地方,您需要在应用程序级别执行检查(在放置实体之前,或者对一组唯一属性进行更改,您进行合适的查询[[仅限速度键]]并检查它空出来了,但这变得相当昂贵(并且很难确保交易安全)。

答案 1 :(得分:2)

我使用record.key()。id()blogged如何,Nick Johnson's博客有亲专家建议

答案 2 :(得分: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,如果您尝试添加另一个程序,它将检查密钥名称是否已存在。这可能不是一个好方法,我也是python / app引擎的初学者。

这是一篇关于使用辅助模型的人的好文章:http://squeeville.com/2009/01/30/add-a-unique-constraint-to-google-app-engine/

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