使用 DynamoDB transact_write_items 如何使用复合主键更新 table 的多个项目?
Using DynamoDB transact_write_items how to update multiple items of a table using Composite primary key?
我想根据主键和排序键的条件更新 table 中的多个项目。是否可以使用 transact_write_items 实现此目的?
我有一个 table,主键为 p_name
,排序键为 a_id
。如果 a_id = a_id1
我必须将 a_status
更新为 active ,否则需要将 a_status
更新为 inactive 对于 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
到 inactive 作为第二次更新调用的一部分,我无法查询特定的 a_id
,因为我不知道还有哪些其他 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'}
}
}
}
])
我想根据主键和排序键的条件更新 table 中的多个项目。是否可以使用 transact_write_items 实现此目的?
我有一个 table,主键为 p_name
,排序键为 a_id
。如果 a_id = a_id1
我必须将 a_status
更新为 active ,否则需要将 a_status
更新为 inactive 对于 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
到 inactive 作为第二次更新调用的一部分,我无法查询特定的 a_id
,因为我不知道还有哪些其他 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'}
}
}
}
])