Я хочу вставить элемент в таблицу 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 решения, которые я нашел до сих пор:
- Создайте новый атрибут
email-service
в таблице который объединяет оба атрибута в одном. Так что я могу просто:
put_item(ConditionExpression=Attr('email-service').not_exists())
Выполнение
query
на столе с индексом, который объединяет
email
и
service
. Если его не существует, вставьте пользователя.
Пока я выбираю 1-й подход. Есть ли что-нибудь лучше?