我们是否可以在不指定属性类型的情况下使用transact\u write\u项?

2024-04-20 01:20:45 发布

您现在位置:Python中文网/ 问答频道 /正文

根据boto3官方文档,transact_write_items方法仅在dynamodb客户端上可用,而在dynamodb服务资源上不可用。dynamodbserviceresource上的方法相对于客户端的优点是,ServiceResource方法不需要您解析自己的属性类型。您可以将基本python字典作为项目插入,而无需指定每个值的属性类型

以下是使用客户端插入项目的示例:

import boto3
client = boto3.client('dynamodb')
client.put_item(
    Item={
        'AlbumTitle': {
            'S': 'Somewhat Famous',
        },
        'Artist': {
            'S': 'No One You Know',
        },
        'SongTitle': {
            'S': 'Call Me Today',
        },
        'NestedValue': {
            'M': {
                'a': {'S': 'apple'},
                'b': {'L': [
                    {'S': 'something else'},
                    {'S': 'another value'}
                ]}
            }
    },
    ReturnConsumedCapacity='TOTAL',
    TableName='Music',
)

以下是使用ServiceResource插入项目的示例:

import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Music')
table.put_item(
    Item={
        'AlbumTitle': 'Somewhat Famous',
        'Artist': 'No One You Know',
        'SongTitle': 'Call Me Today',
        'NestedValue': {
            'a': 'apple',
            'b': [
                'something else',
                'another value'
            ]
        }
    },
)

使用dynamodbserviceresource要干净得多,特别是对于复杂的嵌套值。作为一种解决方法,我一直在编写一个解析器,将python字典转换为dynamodb可消化字典。这应该是可行的,但它不会像让boto3为我处理那样简单或安全。这都是因为事务写入项在ServiceResource上不可用

除非是这样?dynamodb ServiceResourcedynamodb = boto3.resource('dynamodb')在其元对象中有一个客户机dynamodb.meta.client.transact_write_itemstransact_write_items的一个有效的、看似功能性的实例。它似乎可以自动解析我的条目字典,而不需要指定属性类型

import boto3
dynamodb = boto3.resource('dynamodb')
dynamodb.meta.client.transact_write_items(Items=[
    {
        "Put": {
            "TableName": "test",
            "Item": {
                "pk": "a",
                "sk": "b"
            },
            "ReturnValuesOnConditionCheckFailure": "ALL_OLD",
        }
    }
])

vs

import boto3
client = boto3.client('dynamodb')
client.transact_write_items(Items=[
    {
        "Put": {
            "TableName": "test",
            "Item": {
                "pk": {"S": "a"},
                "sk": {"S": "b"}
            },
            "ReturnValuesOnConditionCheckFailure": "ALL_OLD",
        }
    }
])

这是一个可行的解决方案吗?我可以使用dynamodb.meta.client.transact_write_itemstransact_write_items与使用ServiceResource方法所带来的所有自动属性解析好处结合起来使用吗?是否有我不知道的意外副作用?调用嵌套在meta属性深处的方法感觉不太对,但我找不到另一种更干净的方法来获得我想要的

可能有帮助的文件:


Tags: 项目方法importclient客户端字典属性items