Python操作AWS DynamoDB如何针对非主键列设置过滤条件执行查询
问题原因解释
DynamoDB的query操作仅支持对表主键(分区键+可选排序键) 或 索引主键 编写KeyConditionExpression做条件匹配。你当前的表主键分区键为mail,你在查询条件中未包含该必填主键字段,反而使用了非主键列artist作为查询条件,因此触发了ValidationException报错。
非主键列过滤的正确实现方案
方案1:创建全局二级索引(GSI,推荐高频查询使用)
如果你需要频繁按artist字段做过滤查询,最优方案是为artist字段创建全局二级索引,将artist设为该索引的分区键,即可直接对索引执行query操作,效率和主表查询一致,无需扫描全量数据。
示例代码如下(假设你创建的GSI名称为artist-index):
response = table.query( IndexName='artist-index', KeyConditionExpression=Key('artist').eq('Arturus Ardvarkian') ) print(response['Items'])
该方案仅会扫描符合artist条件的索引数据,性能远高于全表扫描。
方案2:Scan加服务端过滤(适合低频小数据量查询使用)
如果你只是临时少量查询,不想额外创建索引,可以继续使用scan操作,但是新增FilterExpression参数,过滤逻辑会在DynamoDB服务端执行,仅返回符合条件的数据,无需你在本地做二次过滤。
示例代码如下:
response = table.scan( FilterExpression=Key('artist').eq('Arturus Ardvarkian') ) print(response['Items'])
注意:该方案本质还是全表扫描,仅减少了返回的网络传输数据量,数据量大时耗时和成本仍然较高,不适合高频使用。如果数据量超过1MB,还需要自行处理LastEvaluatedKey分页拉取所有符合条件的结果。
内容的提问来源于stack exchange,提问作者Utopion
相关产品推荐
相关产品推荐

