Ich möchte nur in Benutzer Tabelle einfügen, wenn userId, E-Mail und Benutzername nicht existiert (wollen diese eindeutig sein).
userId ist der Primärschlüssel (Hash-Schlüssel, Datentyp - Zahl).
Benutzername und E-Mail sind Nicht-Schlüsselattribute (beide Zeichenfolge).Wie überprüft man, ob das Nicht-Schlüssel-Attribut in Dynamodb bereits mit ConditionExpression existiert?
Hier ist, wie ich versuchte:
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
}
)
Ich habe versucht, von hier aus der aws Dokumentation für logische Operatoren und Bedingungsausdruck zu folgen: AWS Conditional Expressions
Aber es jedes Mal in der Tabelle einfügt, auch wenn Benutzername oder E-Mail existiert bereits in der Datenbank.
(Ich gebe neue userIdNext wie es Primärschlüssel ist und kann kein Duplikat sein) nur für Hash-Bereich Tabellenschlüssel Einzigartigkeit zwingen
Ich verwende Python Implementierung boto3
i Globale Sekundärindizes haben zu prüfen, ob Benutzernamen oder E-Mails bereits vorhanden ist, aber es ist nicht Wenn also 2 Benutzer gleichzeitig abfragen und erhalten, dass email1 verfügbar ist, fügen sie beide in die users Tabelle ein und wenn es keine Prüfung gibt, um zu überprüfen, ob email/username bereits existiert, haben wir doppelte Einträge für email/username – kishorer747
Ich habe die Antwort bearbeitet, in diesem Fall sollten Sie Anwendungssperren verwenden (zB memcache) –
Ja, ich habe eine separate Tabelle, die nach Eindeutigkeit für Benutzername und E-Mail sucht, aber in Fällen, in denen 2 Benutzer gleichzeitig versuchen, sich zu registrieren gleiche E-Mail/Benutzername, es fügt sogar wi ein th die Duplikate. Vielen Dank. Ich werde in Schlösser schauen. – kishorer747