【问题标题】: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 来检查这一点

      【讨论】:

        猜你喜欢
        • 2016-01-21
        • 1970-01-01
        • 1970-01-01
        • 2021-05-12
        • 2016-09-05
        • 1970-01-01
        • 2019-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多