如何在Google App Engine中为模型定义唯一属性?

如何在Google App Engine中为模型定义唯一属性?,第1张

如何在Google App Engine中为模型定义唯一属性?

没有用于确保值唯一的内置约束。您可以执行以下 *** 作:

query = MyModel.all(keys_only=True).filter('unique_property', value_to_be_used)entity = query.get()if entity:    raise Exception('unique_property must have a unique value!')

我使用

keys_only=True
它是因为它不会通过获取实体数据来稍微提高性能。

一种更有效的方法是使用没有字段的单独模型,其键名由属性名+值组成。然后,您可以

get_by_key_name
用来获取这些组合键名称中的一个或多个,如果获得一个或多个非
None
值,则说明存在重复值(并检查哪些值不是
None
,您将知道哪些不是唯一的)。


正如 评论中一个人 提到的那样,这些方法(先行先行, 后继性质)会引发
风险并发问题。从理论上讲,可以在检查现有值之后立即创建一个实体,然后仍然执行检查后的代码,从而导致值重复。为防止这种情况,您将必须使用事务:事务-
Google App
Engine



如果要检查 所有 带有事务的实体之间的唯一性,则必须使用第一种方法将它们全部放在同一个组中,这样效率很低。对于事务,请使用如下第二种方法:

class UniqueConstraint(db.Model):    @classmethod    def check(cls, model, **values):        # Create a pseudo-key for use as an entity group.        parent = db.Key.from_path(model.kind(), 'unique-values')        # Build a list of key names to test.        key_names = []        for key in values: key_names.append('%s:%s' % (key, values[key]))        def txn(): result = cls.get_by_key_name(key_names, parent) for test in result:     if test: return False for key_name in key_names:     uc = cls(key_name=key_name, parent=parent)     uc.put() return True        return db.run_in_transaction(txn)

UniqueConstraint.check(...)
将假设每个键/值对必须唯一才能返回成功。事务将为每种模型类型使用单个实体组。这样,一次交易对于多个不同的字段都是可靠的(对于一个字段,这将更加简单。)而且,即使您在一个或多个模型中拥有相同名称的字段,它们也不会与彼此。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5630270.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存