![](/img/trans.png)
[英]Using DynamoDB transact_write_items how to do a ConditionCheck for an existing item and Put a new item if ConditionCheck is True?
[英]Using DynamoDB transact_write_items how to update multiple items of a table using Composite primary key?
我想根据主键和排序键的条件更新表中的多个项目。 是否可以使用 transact_write_items 来实现这一点? 我有一个表,主键为p_name
,排序键为a_id
。 如果a_id = a_id1
,我必须将a_status
更新为active ,否则对于a_id
的任何其他值,我需要将a_status
更新为inactive 。
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
,因为我不知道还会存在哪些其他 id。
注意:所有a_id
值(排序键值)都以a_id
开头,形式为a_id1
、 a_id2
、 a_id3
等。 有没有办法使用transact_write_items
来处理这个问题,我们可以单独基于主键进行查询? 或者,如果有一种方法我们可以在transact_write_items
中根据begins_with
过滤排序键
你应该把你的更新放在像这样的单独对象中:
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'}
}
}
}
])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.