DynamoDB条件读写疑问:是否需预查询判断主键存在性?
DynamoDB操作问题解答
我的DynamoDB表信息
- 表名:
mytable - 表结构:主键为
name
场景1:不存在则插入,存在则更新
问题:是否需要先查询判断name是否存在再执行操作?
不需要。DynamoDB的put_item方法本身就具备**"不存在则插入,存在则覆盖更新"**的特性,完全不需要提前查询判断。你的现有代码逻辑错误——put_item几乎不会抛出需要用update_item处理的异常,try-except块完全多余。
正确代码:
import boto3 def lambda_handler(event, context): dynamodb = boto3.resource('dynamodb') table = dynamodb.Table("mytable") # put_item自动处理插入/覆盖更新,无需额外判断 table.put_item(Item={'name':'john', 'age': 24})
场景2:存在则更新,不存在则不创建
问题:是否需要先查询判断name是否存在再执行操作?
不需要直接提前查询。可以通过update_item的条件表达式实现原子操作,确保只有主键对应条目存在时才执行更新,既避免额外查询开销,又保证操作的原子性。你的现有代码错误:update_item不能直接传Item参数,且未加条件判断时,条目不存在会直接报错。
正确代码:
import boto3 def lambda_handler(event, context): dynamodb = boto3.resource('dynamodb') table = dynamodb.Table("mytable") try: table.update_item( Key={'name': 'john'}, # 指定主键 UpdateExpression='SET age = :val', # 更新表达式 ExpressionAttributeValues={':val': 24}, ConditionExpression='attribute_exists(name)' # 条件:条目必须存在 ) except dynamodb.meta.client.exceptions.ConditionalCheckFailedException: # 条件不满足(条目不存在)时的处理 print("john的条目不存在,不执行更新")
内容的提问来源于stack exchange,提问作者ABCD
相关产品推荐
相关产品推荐

