boto 3: выражение условия, которое ищет пару атрибутов вместе в элементе - PullRequest
0 голосов
/ 13 февраля 2020

Я хочу вставить элемент в таблицу DynamodB, используя put_item(). Я хочу проверить, нет ли элемента в базе данных. Я использую Python и boto 3 ( ссылка на put_item() do c).

Элемент имеет формат:

user {
    string email;
    string service;
}

один и тот же service не может иметь 2 пользователей с одним и тем же адресом электронной почты, но user может зарегистрироваться с одним и тем же email в разных service с.

При добавлении нового пользователя в таблицу, Я проверяю, если его там еще нет:

table.put_item(
    Item=user,
    ConditionExpression=Attr('email').not_exists() and Attr('service').not_exists()
)

Насколько я знаю, он проверяет, существует ли уже service в таблице (конечно, он существует, потому что в этом сервисе зарегистрировано больше пользователей) до) и , если в таблице существует email (может существовать с другим service, но не должно существовать с тем же service).

я хочу сделать ConditionExpression, который ищет пару атрибутов в элементе. Проверьте, существует ли пара ('email', 'service').

2 решения, которые я нашел до сих пор:

  1. Создайте новый атрибут email-service в таблице который объединяет оба атрибута в одном. Так что я могу просто:
put_item(ConditionExpression=Attr('email-service').not_exists())
Выполнение query на столе с индексом, который объединяет email и service. Если его не существует, вставьте пользователя.

Пока я выбираю 1-й подход. Есть ли что-нибудь лучше?

1 Ответ

0 голосов
/ 14 февраля 2020

Я уже нашел ответ в другой теме .

В DynamoDB я не могу ConditionExpression для неключевых атрибутов. Так что это дает мне возможность сначала запросить нужные мне атрибуты, а затем, если ничего не найдено, put_item() мой новый элемент.

...