Клиент GAE Datastore: как создать принудительное ограничение уникальности для свойств - PullRequest
0 голосов
/ 25 декабря 2018

Я использую 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}')

Он не обрабатывает условия гонки ине навязывает уникальность на уровне БД.Есть ли способ сделать это без каких-либо условий гонки?

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Причиной, по которой ваш текущий метод по-прежнему подвержен условиям гонки, является тот факт, что (не являющиеся предками) результаты запроса всегда в конечном итоге непротиворечивы.Даже если вы используете запросы предков (единственные запросы, разрешенные внутри транзакции), вы все равно, вероятно, столкнетесь с условиями гонки из-за модели изоляции и согласованности хранилища данных модель.

Как упоминает Алекс, единственнойспособ гарантировать уникальность состоит в том, чтобы использовать значение свойства в качестве идентификатора ключа сущности (вы бы проверяли существование ключа в вашем методе pre_put_hook, см. TypeError с get_or_insert ).Но вы можете сделать это только для отдельного свойства для вида объекта и, в частности, для свойства адреса электронной почты, это не будет хорошей идеей, поскольку будет трудно обрабатывать изменения адреса электронной почты.

способы обеспечения уникальности, но допускающие временное / временное потенциально дублирующее условие, см. ndb проверить уникальность сущности в транзакции .

0 голосов
/ 02 января 2019

Я нашел этот фрагмент из репозитория webapp2 и изменил его для anom с миксином для легкой интеграции в любое количество моделей.Теперь я могу подтвердить уникальность нескольких полей внутри одной сущности.Конечно, это приводит к дополнительным чтениям при создании новых записей, и эти поля не проверяются на уникальность при обновлении.Поэтому нельзя допускать, чтобы эти поля обновлялись, или аналогичная проверка может быть выполнена, в частности, при обновлении этих полей.Вот это суть .Я надеюсь, что это будет полезно при использовании новой среды исполнения Python 3 GAE и anom в качестве data-mapper

0 голосов
/ 27 декабря 2018

Нет прекрасного способа сделать это на уровне базы данных, кроме использования «электронной почты» в качестве основного ключа пользователя.Вы будете полагаться на код своего веб-приложения / ORM (будь то anom или ndb) для выполнения принудительного исполнения.

См. Этот ответ

составной ключ вОблачное хранилище данных Google

...