Я хочу вставить в таблицу users только в том случае, если userId, email и username не существуют (хотите, чтобы они были уникальными).
userId является первичным ключом (клавиша Hash, тип данных - номер).
имя пользователя и адрес электронной почты являются не-ключевыми атрибутами (обе строки).Как проверить, существует ли неклассический атрибут в dynamodb с помощью ConditionExpression?
Вот как я попробовал:
response = userTable.put_item(
Item={
'userId': userIdNext,
'accType': 0,
'username': usernameInput,
'pwd': hashedPwd,
'email': emailInput
},
ConditionExpression = "(attribute_not_exists(userIdNext)) AND (NOT (contains (email, :v_email))) AND (NOT (contains(username, :v_username)))",
ExpressionAttributeValues={
":v_email": emailInput,
":v_username": usernameInput
}
)
Я пытался следовать AWS документации для логических операторов и выражение условия здесь: AWS Conditional Expressions
Но вставляет каждый раз в таблицу, даже если имя пользователя или электронная почта уже существует в db.
(я даю новый userIdNext как он является первичным ключом и не может быть дубликатом)
Я использую Python реализация boto3
я есть глобальные вторичные индексы, чтобы проверить, если имя пользователя или электронная почта уже существует, но его не Таким образом, если 2 пользователя одновременно запрашивают и получают доступ к электронной почте, они оба вставляются в таблицу users. И если нет проверки, чтобы проверить, нет ли имени/имени пользователя уже, у нас есть повторяющиеся записи для email/username – kishorer747
Я отредактировал ответ. В этом случае вы должны использовать блокировки приложений (например, memcache) –
Да, у меня есть отдельная таблица, которая проверяет уникальность как для имени пользователя, так и для электронной почты. Но в тех случаях, когда 2 пользователя одновременно пытаются зарегистрироваться тот же адрес электронной почты/имя пользователя, он вставляет даже wi th дубликатов. Благодарю. Я посмотрю на замки. – kishorer747