【问题标题】:Boto3: querying DynamoDB with multiple sort key valuesBoto3:使用多个排序键值查询 DynamoDB
【发布时间】:2022-08-08 20:57:18
【问题描述】:
在 Boto3 中进行查询时,是否有任何方法可以为 DynamoDB 表的排序键提供多个值?
对于要搜索的单个 SK 值,我这样做:
table.query(
IndexName=\"my_gsi\",
KeyConditionExpression=Key(\'my_gsi_pk\').eq({pk value}) & Key(\'my_gsi_sk\').eq({sk value}),
FilterExpression={filter expression}
)
...这行得通。
但是,我的场景涉及搜索几个潜在的 SK 值之一,所以我想用 SQL 术语做这样的事情:
WHERE my_gsi_pk = {pk value}
AND my_gsi_sk IN ({sk value 1}, {sk value 2})
我查看了 .query() 部分中的 Boto3 文档,并专注于 KeyConditionExpression 语法,但无法确定这是否可能。
标签:
amazon-dynamodb
boto3
【解决方案1】:
KeyConditionExpression 中的query API does not support the IN operator。
请改用execute_statement API。这将执行PartiQL 语句,其中does accept the IN operator 用于Partition 和Sort 键的查询操作:
sk = ["Foo", "Bar"]
res = client.execute_statement(
Statement=f'SELECT * FROM "my_table"."my_gsi" WHERE my_gsi_pk = ? AND my_gsi_sk IN [{",".join(["?" for k in sk])}]',
Parameters= [{"S": "1"}] + [{"S": k} for k in sk]
)
这将创建像 SELECT * FROM "my_table"."my_gsi" WHERE my_gsi_pk = ? AND my_gsi_sk IN [?, ?] 这样的 PartiQL 语句和像 [{"S": "1"}, {"S": "Foo"}, {"S": "Bar"}] 这样的替换参数。
【解决方案2】:
请注意,PartiQL 将花费更多控制单元比查询。您可以通过请求 ReturnConsumedCapacity = ReturnConsumedCapacity.TOTAL 来检查这一点