簡體   English   中英

使用 DynamoDB transact_write_items 如何使用復合主鍵更新表的多個項目?

[英]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_id1a_id2a_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM