AWS DynamoDB Python - boto3 Key() methods not recognized (Query)

12,789

From what I think: Your Partition Key is Number_Attribute, and so you cannot do a gt when doing a query (you can do an eq and that is it.)

You can do a gt or between for your Sort Key when doing a query. It is also called Range key, and because it "smartly" puts the items next to each other, it offers the possibility of doing gt and between efficiently in a query

Now, if you want to do a between to your partition Key, then you will have to use scan like the below:

Key('Number_Attribute').gt(0)
response = table.scan(
    FilterExpression=fe
)

Keep in mind of the following concerning scan:

The scan method reads every item in the entire table, and returns all of the data in the table. You can provide an optional filter_expression, so that only the items matching your criteria are returned. However, note that the filter is only applied after the entire table has been scanned.

So in other words, it's a bit of a costly operation comparing to query. You can see an example in the documentation here.

Hope that helps!

Share:
12,789
sean
Author by

sean

Former Commodities Analyst, Programmer, Philosopher

Updated on July 19, 2022

Comments

  • sean
    sean almost 2 years

    I am using Lambda (Python) to query my DynamoDB database. I am using the boto3 library, and I was able to make an "equivalent" query:

    This script works:

    import boto3
    from boto3.dynamodb.conditions import Key, Attr
    import json
    
    def create_list(event, context):
        resource = boto3.resource('dynamodb')
        table = resource.Table('Table_Name')
    
        response = table.query(
            TableName='Table_Name',
            IndexName='Custom-Index-Name',
            KeyConditionExpression=Key('Number_Attribute').eq(0)
        )
        return response
    

    However, when I change the query expression to this:

    KeyConditionExpression=Key('Number_Attribute').gt(0)
    

    I get the error:

    "errorType": "ClientError",
      "errorMessage": "An error occurred (ValidationException) when calling the Query operation: Query key condition not supported"
    

    According to this [1] resource, "gt" is a method of Key(). Does anyone know if this library has been updated, or what other methods are available other than "eq"?

    [1] http://boto3.readthedocs.io/en/latest/reference/customizations/dynamodb.html#ref-dynamodb-conditions

    ---------EDIT----------

    I also just tried the old method using:

    response = client.query(
            TableName = 'Table_Name',
            IndexName='Custom_Index',
            KeyConditions = {
                'Custom_Number_Attribute':{
                    'ComparisonOperator':'EQ',
                    'AttributeValueList': [{'N': '0'}]
                }
            }
        )
    

    This worked, but when I try:

    response = client.query(
                TableName = 'Table_Name',
                IndexName='Custom_Index',
                KeyConditions = {
                    'Custom_Number_Attribute':{
                        'ComparisonOperator':'GT',
                        'AttributeValueList': [{'N': '0'}]
                    }
                }
            )
    

    ...it does not work.

    Why would EQ be the only method working in these cases? I'm not sure what I'm missing in the documentation.

  • sean
    sean over 6 years
    Sorry for the delay, I actually got this same answer from AWS Support. You're exactly right, eq is required on the Primary Key. The way I solve this issue is to always add an attribute to each table that holds the same value for all entries that I want to query. That way I can conduct the Query, and also have the option of removing items from accessibility (changing the value of that general attribute) for a general Query. This way it's similar to a Scan, but gives a few more options.