how to check if non-key attribute already exists in dynamodb using ConditionExpression?(如何使用ConditionExpression检查dynamodb中是否已经存在非键属性?)
问题描述
我只想在 userId、email 和 username 不存在时插入 users 表(希望这些是唯一的).
userId 是主键(哈希键,数据类型 - Number ).
用户名和电子邮件是非关键属性(都是字符串).
这是我的尝试:
response = userTable.put_item(项目={'userId': userIdNext,'acctype': 0,'用户名':用户名输入,密码":哈希密码,电子邮件":电子邮件输入},ConditionExpression = "(attribute_not_exists(userIdNext)) AND (NOT (contains (email, :v_email))) AND (NOT (contains(username, :v_username)))",表达式属性值={":v_email": emailInput,":v_username": 用户名输入})
我尝试从此处遵循逻辑运算符和条件表达式的 aws 文档:AWS 条件表达式
但即使用户名或电子邮件已经存在于数据库中,它也会每次都插入到表中.
(我正在提供新的 userIdNext,因为它是主键并且不能重复)
我正在使用 Python 实现 boto3
dynamodb 只能强制哈希范围表键的唯一性(而不是全局二级索引键)
在您的情况下,有 2 个选项:
1) 在应用程序级别强制它 - 查询记录,并查找是否重复
2) 添加另一个具有哈希/范围值的 dynamodb 表(可以强制唯一性),您可以在将项目放入主表之前查询此表
3) 使用应用程序锁(memcache..)
4) 不要使用 dynamodb (也许它不能满足你的要求)
在此处推荐您的答案:
DynamoDB 避免重复的非键属性p>
全球二级索引的DynamoDB一致性读取
I want to insert into users table only if userId, email and username does not exist ( want these to be unique).
userId is the primary key ( Hash key, data type - Number ).
username and email are non-key attributes ( both string ).
Here is how i tried:
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
}
)
I tried to follow the aws documentation for logical operators and condition expression from here: AWS Conditional Expressions
But it is inserting everytime into table even if username or email already exists in the db.
( i am giving new userIdNext as it is primary key and cannot be a duplicate )
I am using Python implemetation boto3
dynamodb can force uniqueness only for hash-range table keys (and not for global secondary index keys)
in your case there are 2 options:
1) force it on application level - query for records, and find if duplicate
2) add another dynamodb table with hash/range values (that can enforce uniqeness), you can query this table before putting an item to the main table
3) use application locks (memcache..)
4) dont use dynamodb (maybe its not answer your requirements )
referring you to answers here:
DynamoDB avoid duplicate non-key attributes
DynamoDB consistent reads for Global Secondary Index
这篇关于如何使用ConditionExpression检查dynamodb中是否已经存在非键属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何使用ConditionExpression检查dynamodb中是否已经存在非键属性?
基础教程推荐
- 线程时出现 msgbox 错误,GUI 块 2022-01-01
- Python kivy 入口点 inflateRest2 无法定位 libpng16-16.dll 2022-01-01
- 用于分类数据的跳跃记号标签 2022-01-01
- 使用PyInstaller后在Windows中打开可执行文件时出错 2022-01-01
- Dask.array.套用_沿_轴:由于额外的元素([1]),使用dask.array的每一行作为另一个函数的输入失败 2022-01-01
- 在 Python 中,如果我在一个“with"中返回.块,文件还会关闭吗? 2022-01-01
- 筛选NumPy数组 2022-01-01
- 何时使用 os.name、sys.platform 或 platform.system? 2022-01-01
- 如何在海运重新绘制中自定义标题和y标签 2022-01-01
- 如何让 python 脚本监听来自另一个脚本的输入 2022-01-01