如何在Python中生成含多排序键的DynamoDB BatchGetItem Keys数组
解决Boto3 BatchGetItem生成含多排序键Keys数组的问题
问题背景
使用Python的Boto3调用DynamoDB的BatchGetItem接口时,针对带排序键的表(如SortedKeyBossTable),需要为每个id生成两个不同排序键的条目,但之前的写法无法生成合法的JSON结构,导致执行失败。此前处理无排序键表时的逻辑如下,运行正常:
填充Keys节点的代码:
{ DYNAMODB_TABLE: { 'Keys': generate_keydicts(myids, table_name) } }
对应辅助函数:
if table_to_query == 'BossTable': return [{'id': myid} for myid in myids]
尝试的错误写法:
if table_to_query == 'SortedKeyBossTable': keys = [] for myid in myids: single_key = {{'id': myid},{"sortkey":"sortkey1"}, {'id': myid},{"sortkey":"sortkey2"}} keys.append(single_key) return keys
该写法生成的结构不合法,无法被DynamoDB识别。
解决方案
DynamoDB的Keys数组要求每个元素是包含主键和排序键的完整字典,每个主键+排序键的组合对应一个单独的字典条目。正确的批量生成方式是遍历每个id,为每个排序键创建一个独立的字典,然后添加到列表中。
修改后的辅助函数:
if table_to_query == 'SortedKeyBossTable': keys = [] # 定义需要的排序键值列表 sort_keys = ["sortkey1", "sortkey2"] for myid in myids: # 为当前id的每个排序键生成一个完整的键字典 for sk in sort_keys: keys.append({'id': myid, 'sortkey': sk}) return keys
说明
- 该逻辑会为每个
id生成2个条目,2000个ID最终会生成4000个键字典(注意:BatchGetItem单次请求最多支持100个键,若超过需要拆分请求,不过这是独立于键生成的额外逻辑) - 生成的列表结构符合DynamoDB要求,示例输出如下(假设
myids = ["id1", "id2"]):
[ {'id': 'id1', 'sortkey': 'sortkey1'}, {'id': 'id1', 'sortkey': 'sortkey2'}, {'id': 'id2', 'sortkey': 'sortkey1'}, {'id': 'id2', 'sortkey': 'sortkey2'} ]
这个结构是合法的JSON数组,能被BatchGetItem接口正确解析。
内容的提问来源于stack exchange,提问作者Balkyto
相关产品推荐
相关产品推荐

