使用 DynamoDB transact_write_items 如何对现有项目执行 ConditionCheck 并在 ConditionCheck 为 True 时放置新项目?

Using DynamoDB transact_write_items how to do a ConditionCheck for an existing item and Put a new item if ConditionCheck is True?

我只想在 table 中插入一个新项目,前提是特定项目已经存在。是否可以使用 transact_write_items 实现此目的?我想避免查询 table 然后插入新项目。

response = dynamo_client.transact_write_items(
    TransactItems=[
        {
            'ConditionCheck': {
                'Key': {
                    'indicator_id': {
                        'S': 'indicator_1'
                    }
                },
                'ConditionExpression': 'attribute_exists(#indicator_id)',
                'ExpressionAttributeNames': {
                    '#indicator_id': 'indicator_id'
                },
                'TableName': 'CAS'
            },
            'Put': {
                'Key': {
                    'indicator_id': {
                        'S': 'update_indicator_1'
                    }
                },
                'TableName': 'CAS'
            }
        }
    ]
)

这会引发以下错误:

botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the TransactWriteItems operation: TransactItems can only contain one of Check, Put, Update or Delete

语法有问题。

正确的语法是:

response = dynamo_client.transact_write_items(
    TransactItems=[
        {
            'ConditionCheck': {
                'Key': {
                    'indicator_id': {
                        'S': 'indicator_1'
                    }
                },
                'ConditionExpression': 'attribute_exists(#indicator_id)',
                'ExpressionAttributeNames': {
                    '#indicator_id': 'indicator_id'
                },
                'TableName': 'CAS'
            }
        },
        {
            'Put': {
                'Key': {
                    'indicator_id': {
                        'S': 'update_indicator_1'
                    }
                },
                'TableName': 'CAS'
            }
        }
    ]
)

您的参数需要修改 2 处 TransactItems

json中的操作应该重新安排

在 Put 操作中将 Key 替换为 Item

response = dynamo_client.transact_write_items(
    TransactItems=[
        {
            'ConditionCheck': {
                'Key': {
                    'indicator_id': {
                        'S': 'indicator_1'
                    }
                },
                'ConditionExpression': 'attribute_exists(#indicator_id)',
                'ExpressionAttributeNames': {
                    '#indicator_id': 'indicator_id'
                },
                'TableName': 'CAS'
            }
        },
        {
            'Put': {
                'Item': {
                    'indicator_id': {
                        'S': 'insert_indicator_2'
                    }
                },
                'TableName': 'CAS'
            }
        }
    ]
)

在文档中 (https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.transact_write_items) 尽管在同一个字典中提到了所有操作,但仅供参考,应将其视为 Check 或 Put 等

操作应该是这样的字典的数组(列表)