为何DynamoDB中KeyConditionExpression可用但get_item报错?
解答DynamoDB query与get_item的差异及报错问题
1. 为何相同键参数下query能工作,get_item报错?
DynamoDB的query和get_item对主键的要求完全不同:
query是基于主键的条件查询:只要你提供的键匹配分区键(如果是复合主键,也可搭配排序键做范围查询),就能返回对应分区内的所有匹配项。哪怕只传了分区键、没传排序键(若表有排序键),query也能正常执行,返回该分区下的所有数据。get_item是精准获取单条数据:要求你必须提供完整的主键集合——如果表是单主键(仅分区键),只传分区键即可;如果是复合主键(分区键+排序键),必须同时传入这两个键的名称和对应值,少任何一个都会触发ValidationException,因为不符合表的主键schema。
你遇到的情况,大概率是表用了复合主键,而你在get_item里只传了分区键、没传排序键,但query仅需分区键就能执行,所以两者表现不同。
2. get_item方法能否正常运行?
完全可以,但必须严格按照表的主键定义传参。举个Python(boto3)的示例:
- 若表的主键是单分区键
user_id:
import boto3 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('your-table-name') response = table.get_item( Key={ 'user_id': '12345' } )
- 若表是复合主键(分区键
user_id+ 排序键order_id):
response = table.get_item( Key={ 'user_id': '12345', 'order_id': '67890' } )
只要保证Key字典包含了表主键的所有属性,get_item就能正常返回对应的数据。
内容的提问来源于stack exchange,提问作者dimButTries
相关产品推荐
相关产品推荐

