#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'}
}
}
}
])