DynamoDB使用IN操作符查询指定domain列表时参数校验报错如何解决
问题原因
- 直接报错原因:DynamoDB的
query接口不支持ConditionExpression参数,该参数仅用于数据写入、更新、删除场景的条件校验,不属于查询操作的合法参数。 - 底层逻辑问题:
query操作仅支持查询单个分区键值对应的数据,你需要查询多个分区键值匹配的条目,应该使用batch_get_item接口实现。
正确实现代码
from botocore.exceptions import ClientError domains_hash =('196af8b5fca2fa43e8f328d7bd996eafc2d799c1b90233a84d43a5c8cd52ac97', 'f4af8a416f59f0829e39006e59a3698a3580d310ae2617dcc418b33a90cc9f01', '3bf08cfb1b1a363c04ae2ce1c1177641ffb9ca09bc835faff47c025d5379ae6e', '6dd22c3e88531abea2dec8403a2a1d9bc23376470c4bc2b2145fd03deef270bb', 'a402e656cf14b4794fd3762074ad4689cd086efa7c377ae19d68c4d38cee41f3', '6d9d3804f2fa1e876533cb3131b1c49414dfbcd710b4710922426244971145ca', 'f92c9f9a1799252fec6d397a22271183b01625c279b4af324cb49056a62633f4') try: # 构造批量查询的主键列表,domain为分区键 keys = [{'domain': d} for d in domains_hash] # 调用batch_get_item查询 res = endpoint_users.batch_get_item( Keys=keys ) except ClientError as e: raise DopeException # 最终查询结果存储在 res['Responses'][你的表名] 中
额外注意点
batch_get_item单次请求最多支持查询100个主键,如果你domains_hash的长度超过100,需要拆分成分批查询。- 接口会返回
UnprocessedKeys字段存储查询失败的主键,生产环境建议添加重试逻辑处理未查询成功的条目。 - 如果你需要针对每个分区键下的排序键做倒序排列,需要单独对每个分区键发起
query请求,设置ScanIndexForward=False,再把结果合并。
内容的提问来源于stack exchange,提问作者Jeet Patel
相关产品推荐
相关产品推荐

