dynamodb ConditionExpression 未按预期工作

问题描述 投票:0回答:1

仅当属性值不存在时,我才想在 dynamodb 中插入记录。

     try:
        NewsTable.put_item(
            Item={
                "PK": "intentional_id_to_check_failing_of_ConditionExpression",
                "SK": f"news#id#{uuid.uuid4().hex}",
                "model_type": "TEST_MODEL",
                "title": "dummy_title_1",
                "timestamp": Decimal(str(datetime.now().timestamp())),
            },
            ConditionExpression="attribute_not_exists(PK)",
        )
    except resource.meta.client.exceptions.ConditionalCheckFailedException as e:
        print(e)
  1. 上面我想做的是仅在 PK 不存在时插入
  2. 我检查了这个答案,我发现上面应该有效如何使用 boto3 有条件地将项目插入到 dynamodb 表中
  3. 如果我有什么问题,请帮助我理解我错过了什么。
  4. IDEALLY-> 我只想在记录标题尚不存在时插入
  5. 现在只接受 PK 是因为它过去确实有效,但现在不起作用。

我尝试过的更多代码:

    pk = "intentional_id_to_check_failing_of_ConditionExpression"
    try:
        NewsTable.put_item(
            Item={
                "PK": pk,
                "SK": f"news#id#{uuid.uuid4().hex}",
                "model_type": "TEST_MODEL",
                "title": "dummy_title_1",
                "timestamp": Decimal(str(datetime.now().timestamp())),
            },
            ConditionExpression=Attr("PK").ne(pk),
        )
    except resource.meta.client.exceptions.ConditionalCheckFailedException as e:
        print(e)

这里我使用 Attr 且条件不相等

python amazon-dynamodb
1个回答
0
投票

如果您的主键同时包含 PK 和 SK,那么您需要根据 DynamoDB 开发者指南文档检查这两个值是否评估为 true 或 false。

以下示例在尝试写入操作之前使用 attribute_not_exists() 检查表中是否存在主键。

如果您的主键包含 PK 和 SK 正如我上面提到的,这个短语可能与您的情况有关。

注意 如果您的主键同时包含分区键 (pk) 和排序键 (sk),则该参数将在尝试写入操作之前检查 attribute_not_exists(pk) 和 attribute_not_exists(sk) 的计算结果是否为 true 或 false。

这意味着,您可以根据需要在查询中使用

Logial operators
AND
OR
。请参阅以下 DynamoDB
API 参考文档
中的 ConditionExpression 详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.