You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的运行逻辑:

  1. 当表中不存在相同ticker+price_date的记录时,Attr("price_date").not_exists()返回True,允许写入新记录
  2. 当表中已存在相同主键的记录时,Attr("price_date").not_exists()返回False,触发条件校验失败,不会覆盖原有记录,完全符合你的业务需求

内容的提问来源于stack exchange,提问作者Ryan Davies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:36:03