GAE Datastore 客户端:如何对属性创建强制唯一约束
GAE Datastore client: How to create enforce unique constraint on properties
我正在使用 anom 与 GAE 数据存储实体进行映射。我正在寻找一种可扩展的方式来实现对属性的唯一约束。
到目前为止,在创建这样的新记录之前,我正在检查查询
class User(Model):
...
email_id = props.String(indexed=True)
...
def pre_put_hook(self):
if (not self.id_or_name) and (User.query().where(User.email_id == self.email_id).count() > 0):
raise IntegrityError(f'Duplicate entry: User.email == {self.email_id}')
它不处理竞争条件,也不会在数据库级别强制唯一性。有没有办法在没有任何竞争条件的情况下做到这一点?
除了使用 'email' 作为用户的主键之外,没有其他好的方法可以在数据库级别执行此操作。您将依赖您的 Web 应用程序代码/ORM(无论是 anom
还是 ndb
)来执行。
看到这个答案
composite key in google cloud datastore
您当前的方法仍然容易出现竞争条件的原因是(非祖先)查询结果始终最终一致。即使您使用祖先查询(事务中唯一允许的查询),由于数据存储的 Isolation and consistency 模型,您可能仍可能面临竞争条件。
正如 Alex 提到的那样,确保唯一性的唯一方法是使用 属性 值作为实体的键标识符(您将在 pre_put_hook
方法中检查键是否存在,请参阅)。但是您只能针对实体种类的单个 属性 执行此操作,特别是针对电子邮件地址 属性 这不是一个好主意,因为处理电子邮件地址更改很困难。
可能有一些方法可以强制唯一性,但允许 temporary/transient 可能重复的条件,请参阅 。
我找到了这个snippet from webapp2's repository and modified it for anom
使用 mixin 可以轻松集成到任意数量的模型中。现在我可以确认单个实体内多个字段的唯一性。当然,这在创建新记录时会受到额外的读取,并且在更新时不会检查这些字段的唯一性。因此,必须不允许更新这些字段,或者在特别更新这些字段时可以进行类似的检查。这里是gist。我希望这在使用 GAE 的新 Python 3 运行时和 anom
作为数据映射器时有用
我正在使用 anom 与 GAE 数据存储实体进行映射。我正在寻找一种可扩展的方式来实现对属性的唯一约束。
到目前为止,在创建这样的新记录之前,我正在检查查询
class User(Model):
...
email_id = props.String(indexed=True)
...
def pre_put_hook(self):
if (not self.id_or_name) and (User.query().where(User.email_id == self.email_id).count() > 0):
raise IntegrityError(f'Duplicate entry: User.email == {self.email_id}')
它不处理竞争条件,也不会在数据库级别强制唯一性。有没有办法在没有任何竞争条件的情况下做到这一点?
除了使用 'email' 作为用户的主键之外,没有其他好的方法可以在数据库级别执行此操作。您将依赖您的 Web 应用程序代码/ORM(无论是 anom
还是 ndb
)来执行。
看到这个答案
composite key in google cloud datastore
您当前的方法仍然容易出现竞争条件的原因是(非祖先)查询结果始终最终一致。即使您使用祖先查询(事务中唯一允许的查询),由于数据存储的 Isolation and consistency 模型,您可能仍可能面临竞争条件。
正如 Alex 提到的那样,确保唯一性的唯一方法是使用 属性 值作为实体的键标识符(您将在 pre_put_hook
方法中检查键是否存在,请参阅
可能有一些方法可以强制唯一性,但允许 temporary/transient 可能重复的条件,请参阅
我找到了这个snippet from webapp2's repository and modified it for anom
使用 mixin 可以轻松集成到任意数量的模型中。现在我可以确认单个实体内多个字段的唯一性。当然,这在创建新记录时会受到额外的读取,并且在更新时不会检查这些字段的唯一性。因此,必须不允许更新这些字段,或者在特别更新这些字段时可以进行类似的检查。这里是gist。我希望这在使用 GAE 的新 Python 3 运行时和 anom
作为数据映射器时有用