如何在谷歌数据存储中复制独特的数据存储实体?

时间:2017-11-07 04:37:36

标签: python google-app-engine google-cloud-datastore

我需要在Google数据存储中强制执行类的唯一性。以下是我如何强制执行唯一性

from google.appengine.ext import ndb
from webapp2_extras.appengine.auth.models import Unique


class UserTag(ndb.Model)):
    user_key = ndb.KeyProperty(kind='User', required=True)
    name = ndb.StringProperty()

    def _pre_put_hook(self):
        super(UserTag, self)._pre_put_hook()
        success = Unique.create(self.user_key)
        if not success:
            raise Exception('Cannot create unique key: %s' % unique_key)

这种方法正常,直到我想在UserTag命名空间中保留archive版本,只要修改了UserTag的实例。

cloned_user_tag = UserTag(user_key=orig.user_key, name=orig.name, namespace='archive')
cloned_user_tag.put(cloned_user_tag)  # throw exception

然后会抛出异常

Exception: Cannot create unique key: UserTag:123

避免此问题的最佳方法是什么?暂停执行唯一性的最佳方法是什么?如果命名空间为Unique.create,我可以跳过archive,但

1)我怎么知道当前的命名空间

2)是否有更好的解决方案

1 个答案:

答案 0 :(得分:0)

我相信您可以检查_pre_put_hook()内的命名空间,如下所示:

    def _pre_put_hook(self):
        super(UserTag, self)._pre_put_hook()        
        if self._key.namespace() != 'archive':
            success = Unique.create(self.user_key)
            if not success:
                raise Exception('Cannot create unique key: %s' % unique_key)