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

Python 我们是否可以在不指定属性类型的情况下使用transact\u write\u项?,python,amazon-dynamodb,boto3,Python,Amazon Dynamodb,Boto3,根据boto3官方文档,transact_write_items方法仅在dynamodb客户端上可用,而在dynamodb服务资源上不可用。dynamodbserviceresource上的方法相对于客户端的优点是,ServiceResource方法不需要您解析自己的属性类型。您可以将基本python字典作为项目插入,而无需指定每个值的属性类型 以下是使用客户端插入项目的示例: import boto3 client = boto3.client('dynamodb') client.put_i

根据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',
)
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'
            ]
        }
    },
)
以下是使用ServiceResource插入项目的示例:

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',
)
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 ServiceResource
dynamodb=bot3.resource('dynamodb')
在其元对象中有一个客户端
dynamodb.meta.client.transact\u write\u items
transact\u write\u 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

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

可能有帮助的文件:

  • Boto3交易记录项目的官方文件:
  • 相关github线程:

    • 显然,这是boto3的预期行为。一个开发者的bug是另一个开发者的特性