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

Я хочу обновить несколько элементов в таблице на основе условий первичного ключа и ключа сортировки. Можно ли добиться этого с помощью transact_write_items? У меня есть таблица с первичным ключом как p_name и ключом сортировки как a_id. Мне пришлось бы обновить a_status до активного, если 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, до неактивных в рамках второго вызова обновления, я не мог запросить его для конкретного a_id, поскольку я не знал бы, какие другие идентификаторы будут существовать.

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
1 446
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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'}
            }
        }
    }
])

Другие вопросы по теме