Я хочу обновить несколько элементов в таблице на основе условий первичного ключа и ключа сортировки. Можно ли добиться этого с помощью 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
Вы должны поместить свое обновление в отдельные объекты следующим образом:
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'}
}
}
}
])