Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用ConditionExpression检查dynamodb中是否已经存在非键属性?_Python_Amazon Web Services_Amazon Dynamodb_Boto3 - Fatal编程技术网

Python 如何使用ConditionExpression检查dynamodb中是否已经存在非键属性?

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、email和username不存在时(希望它们是唯一的)插入users表
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 implementationboto3

dynamodb只能强制哈希范围表键的唯一性(而不能强制全局二级索引键)

在您的情况下,有两个选项:

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!但你应该在评论中这样做。