DynamoDB使用Conditional Put_Item条件写入时条件表达式报错如何解决?
条件表达式错误原因及修复方案
核心问题
你写的条件表达式存在两个逻辑错误,不符合DynamoDB的运行规则:
- 错误1:多余添加了
Attr("ticker").exists()判断。DynamoDB的PutItem操作天然基于完整主键(分区键+排序键)定位记录,仅会校验和你传入的Item具有完全相同ticker+price_date的已存在记录,和同ticker其他排序键的记录没有任何关系。当待写入的主键组合在表中不存在时,ticker属性自然不存在,直接导致条件校验失败报错。 - 错误2:逻辑完全矛盾。如果表中已存在相同主键的记录,那么
ticker和price_date都存在,不满足你的条件;如果表中不存在相同主键的记录,ticker不存在,也不满足条件,最终任何场景下都无法写入数据。
修复方案
你的需求是仅当相同主键的记录不存在时才写入,避免覆盖旧数据,直接删除ticker存在的判断即可,修改后的代码如下:
import boto3 from boto3.dynamodb.conditions import Attr from botocore.exceptions import ClientError dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('stock-intraday') data = [ {'ticker': 'GOOG', 'price_date': '2021-10-08T9:30:00.000Z', 'price': 100}, {'ticker': 'GOOG', 'price_date': '2021-10-08T9:31:00.000Z', 'price': 101} ] for item in data: try: dynamodb_response = table.put_item( Item=item, ConditionExpression=Attr("price_date").not_exists() ) except ClientError as e: # 忽略条件检查失败的异常(即相同主键已存在的情况) if e.response['Error']['Code'] != 'ConditionalCheckFailedException': raise
原理说明
修改后的条件表达式符合DynamoDB的运行逻辑:
- 当表中不存在相同
ticker+price_date的记录时,Attr("price_date").not_exists()返回True,允许写入新记录 - 当表中已存在相同主键的记录时,
Attr("price_date").not_exists()返回False,触发条件校验失败,不会覆盖原有记录,完全符合你的业务需求
内容的提问来源于stack exchange,提问作者Ryan Davies
相关产品推荐
相关产品推荐

