Использование DynamoDB transact_write_items как обновить несколько элементов таблицы с помощью составного первичного ключа?

#python #amazon-web-services #amazon-dynamodb #boto3 #dynamodb-queries

#python #amazon-веб-сервисы #amazon-dynamodb #boto3 #dynamodb-запросы

Вопрос:

Я хочу обновить несколько элементов в таблице на основе условий первичного ключа и ключа сортировки. Возможно ли добиться этого с помощью transact_write_items? У меня есть таблица с первичным ключом as p_name и ключом сортировки as a_id . Мне пришлось бы обновить a_status до active if a_id = a_id1 , иначе потребуется обновить a_status до неактивного для любого другого значения a_id .

 response = dynamo_client.transact_write_items(
    TransactItems=[
        {
            'Update': {
                'TableName': 'table-1',
                'Key': {
                    'p_name': {
                        'S': 'pName'
                    },
                    'a_id': {
                        'S': 'a_id1'
                    }
                },
                'ConditionExpression': 'a_id = :a_id',
                'UpdateExpression': 'set a_status = :aStatus'
                'ExpressionAttributeNames': {
                    ':a_id': {'S': 'a_id1'},
                    ':aStatus': {'S': 'active'}
                }
            },
            'Update': {
                'TableName': 'table-1',
                'Key': {
                    'p_name': {
                        'S': 'pName'
                    },
                    'a_id': {
                        'S': 'a_id1'
                    }
                },
                'ConditionExpression': 'a_id <> :a_id',
                'UpdateExpression': 'set a_status = :aStatus'
                'ExpressionAttributeNames': {
                    ':a_id': {'S': 'a_id1'},
                    ':aStatus': {'S': 'inactive'}
                }
            }
        }
    ]
)
 

Это выдает следующую ошибку:

An error occurred (ValidationException) when calling the TransactWriteItems operation: Transaction request cannot include multiple operations on one item .

Однако, поскольку я хотел обновить все элементы, которые не a_id являются a_id1 неактивными, как часть второго вызова update, я не мог запросить его для конкретного a_id , поскольку я не знал, какие другие идентификаторы будут существовать.

Примечание: все a_id значения (значения ключа сортировки) начинаются с a_id и будут иметь форму a_id1 , a_id2 , a_id3 и так далее. Был ли какой-либо способ справиться с этим, используя transact_write_items where in мы можем запрашивать только на основе первичного ключа? Или, если бы был способ, которым мы могли бы фильтровать ключ сортировки на основе begins_with внутри transact_write_items

Ответ №1:

Вы должны поместить свое обновление для разделения таких объектов:

 response = dynamo_client.transact_write_items(
TransactItems=[
    {
        'Update': {
            'TableName': 'table-1',
            'Key': {
                'p_name': {
                    'S': 'pName'
                },
                'a_id': {
                    'S': 'a_id1'
                }
            },
            'ConditionExpression': 'a_id = :a_id',
            'UpdateExpression': 'set a_status = :aStatus'
            'ExpressionAttributeNames': {
                ':a_id': {'S': 'a_id1'},
                ':aStatus': {'S': 'active'}
            }
        }
    },
    {
        'Update': {
            'TableName': 'table-1',
            'Key': {
                'p_name': {
                    'S': 'pName'
                },
                'a_id': {
                    'S': 'a_id1'
                }
            },
            'ConditionExpression': 'a_id <> :a_id',
            'UpdateExpression': 'set a_status = :aStatus'
            'ExpressionAttributeNames': {
                ':a_id': {'S': 'a_id1'},
                ':aStatus': {'S': 'inactive'}
            }
        }
    }
])