首页 > 解决方案 > 使用 DynamoDB transact_write_items 如何对现有项目进行 ConditionCheck 并在 ConditionCheck 为 True 时放置新项目?

问题描述

仅当特定项目已存在时,我才想在表中插入新项目。是否可以使用 transact_write_items 来实现这一点?我想避免查询表然后插入新项目。

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

标签: pythonamazon-web-servicesamazon-dynamodbboto3dynamodb-queries

解决方案


您的参数TransactItems需要进行 2 处修改

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 等

操作应该是此类字典的数组(列表)


推荐阅读