Python 我们是否可以在不指定属性类型的情况下使用transact\u write\u项?
根据boto3官方文档,transact_write_items方法仅在dynamodb客户端上可用,而在dynamodb服务资源上不可用。dynamodbserviceresource上的方法相对于客户端的优点是,ServiceResource方法不需要您解析自己的属性类型。您可以将基本python字典作为项目插入,而无需指定每个值的属性类型 以下是使用客户端插入项目的示例: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
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 ServiceResourcedynamodb=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是另一个开发者的特性