DynamoDB PutItem 不创建新项目

DynamoDB PutItem does not create new item

我使用 lambda 检测我的 table 中是否有任何 isActive 记录,如果有则 put_item 更新 ID。

例如,我有一个 ID 为 999999999 的占位符记录,如果我的 table 查询检测到有一个活动记录 (isActive = True),它将 put_item 与真实 session_id 和其他数据。

Table记录:

我的 lambda 有以下部分(来自我的 cloudwatch,if...else 语句按预期工作以验证逻辑)。请忽略我复制和粘贴时的缩进问题,代码运行没有问题。

##keep "isActive = True" when there's already an active status started from other source, just updating the session_id to from 999999999 to real session_id

    else:
        count_1 = query["Items"][0]["count_1"] <<< from earlier part of code to retrieve from current count_1 value from the table.
        print(count_1) << get the right '13' value from the current table id = '999999999'
        table.put_item(
           Item={
                    'session_id': session_id,
                    'isActive': True,
                    'count_1': count_1,
                    'count_2': count_2
                },
                ConditionExpression='session_id = :session_id AND isActive = :isActive',
                ExpressionAttributeValues={
                    ':session_id': 999999999,
                    ':isActive': True
                }
                )

但是我的 table 没有得到新项目,主键 session_id 也没有更新。 Table还是上图

我从 documentation 了解到

You cannot use UpdateItem to update any primary key attributes. Instead, you will need to delete the item, and then use PutItem to create a new item with new attributes.

但即使 put_item 无法更新主键,至少我希望在没有抛出任何错误代码的情况下从我的代码创建一个新项目?

有人知道发生了什么事吗?谢谢

我用 ConditionExpression 的不同规范解决了它。进行了多种故障排除方法并查明问题来自 ConditionExpression:

我做了什么 - 添加 boto3.dynamodb.conditions import Key & Attr

的导入

并使用 ConditionExpressionConditionExpression=Attr("session_id").ne(999999999)

并删除旧 ID 项目

table.delete_item(
   Key={
       'session_id': 999999999
   }
)

此处提供其他条件https://boto3.amazonaws.com/v1/documentation/api/latest/reference/customizations/dynamodb.html#ref-dynamodb-conditions

如果谁有其他更好更简单的方法想要学习