Voglio inserire nella tabella utenti solo se userId, email e username non esistono (vuoi che siano unici).
userId è la chiave primaria (chiave hash, tipo di dati: numero).
nome utente e indirizzo email sono attributi non chiave (entrambi stringa).come verificare se l'attributo non chiave esiste già in dynamodb usando ConditionExpression?
Ecco come ho provato:
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
}
)
ho cercato di seguire la documentazione AWS per gli operatori logici e di espressione condizione da qui: AWS Conditional Expressions
ma è inserendo ogni volta in tavola, anche se il nome utente o email esiste già nel db.
(sto dando nuova userIdNext come è chiave primaria e non può essere un duplicato)
Sto usando Python Implementazione boto3
ho indici globali secondari per controllare se il nome utente o e-mail esiste già, ma non è Quindi se 2 utenti interrogano allo stesso tempo e ottengono che email1 è disponibile, entrambi inseriscono nella tabella degli utenti e, se non vi è alcun controllo per verificare se e-mail/nome utente non esistono già, abbiamo voci duplicate per email/nome utente – kishorer747
ho modificato la risposta, in questo caso dovresti usare i blocchi applicazione (ad esempio memcache) –
sì, ho una tabella separata che controlla l'univocità sia per il nome utente che per l'email, ma nei casi in cui 2 utenti allo stesso tempo provano a registrarsi stessa email/nome utente, sta inserendo anche wi i duplicati. Grazie. Guarderò dentro le serrature. – kishorer747