Python 如何使用ConditionExpression检查dynamodb中是否已经存在非键属性?
我只想在userId、email和username不存在时(希望它们是唯一的)插入users表Python 如何使用ConditionExpression检查dynamodb中是否已经存在非键属性?,python,amazon-web-services,amazon-dynamodb,boto3,Python,Amazon Web Services,Amazon Dynamodb,Boto3,我只想在userId、email和username不存在时(希望它们是唯一的)插入users表 userId是主键(散列键,数据类型-数字) 用户名和电子邮件是非关键属性(均为字符串) 以下是我如何尝试的: response = userTable.put_item( Item={ 'userId': userIdNext, 'accType': 0, 'username': usernameInput, 'pwd': hashedPwd, 'email'
userId是主键(散列键,数据类型-数字)
用户名和电子邮件是非关键属性(均为字符串) 以下是我如何尝试的:
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文档中的逻辑运算符和条件表达式:
但即使数据库中已经存在用户名或电子邮件,它也会将每次都插入到表中。(我将提供新的userIdNext,因为它是主键,不能重复)
我正在使用Python implementationboto3dynamodb只能强制哈希范围表键的唯一性(而不能强制全局二级索引键) 在您的情况下,有两个选项: 1) 在应用程序级别强制执行-查询记录,并查找是否重复 2) 添加另一个具有哈希/范围值(可以强制唯一性)的dynamodb表,您可以在将项放入主表之前查询此表 3) 使用应用程序锁(memcache…) 4) 不要使用dynamodb(可能它不能满足您的要求) 请参阅此处的答案:
好的,我在应用程序中发现了错误 我试图向DynamoDB传递一个条件put项,但是我传递了一个不同的主键,这个主键存在于DynamoDB上,此时将创建一个新对象,并且忽略了条件表达式
#id主键
id=123
#电子邮件是唯一的索引
电子邮件=”email@email.com"
项目={
“id”:id,
“电子邮件”:电子邮件
“信息”:{
“性别”:“男性”,
“国家”:“葡萄牙”
}
}
response=self.\u table.put\u item(item=item,ConditionExpression=“email:v\u email”,ExpressionAttributeValues={”:v\u email:email})
如果希望条件表达式在DynamoDB put_项上正常工作,则应发送与DB上相同的主键
kishorer747,你能不能把你的代码的一个例子,这样做?”“是的
用于检查用户名或电子邮件是否存在的全局辅助索引
已经存在,但它不是原子的。所以如果两个用户同时查询
如果email1可用,它们都会插入到用户表中。并且
如果没有检查以验证电子邮件/用户名是否不存在
我们已经有重复的电子邮件/用户名条目”
我有全局二级索引来检查用户名或电子邮件是否已经存在,但它不是原子的。所以,如果两个用户同时查询并得到email1可用,他们都会插入到users表中。如果没有检查来验证电子邮件/用户名是否已经不存在,我们就有重复的电子邮件/用户名条目我编辑了答案。在这种情况下,您应该使用应用程序锁(例如memcache)。是的,我有一个单独的表,用于检查用户名和电子邮件的唯一性。但是,当两个用户同时尝试使用相同的电子邮件/用户名注册时,即使使用重复的电子邮件/用户名也会插入。谢谢我将研究锁。@kishorer747您应该不会有任何问题,在具有所需唯一映射的辅助表上强制唯一性,例如用户电子邮件地址,然后仅在电子邮件地址表上的插入有效时才插入。然而,当更新电子邮件地址时,这会显著增加复杂性,因为它必须存储在两个表中并更新两次,或者对用户表的每个查询也必须查询电子邮件表才能获得电子邮件。您可以这样提及用户以引起他们的注意:@malmeida hello!但你应该在评论中这样做。