Dynamodb - 使用python boto3通过GSI查询

时间:2016-02-16 14:07:51

标签: python python-2.7 amazon-dynamodb boto boto3

我正在使用python boto3来处理dynamodb。我使用以下脚本创建了一个表:

 cls.table = dynamodb.create_table(
        TableName='table-unittest',
        KeySchema=[
            {
                'AttributeName': 'id',
                'KeyType': 'HASH',
            },
            {
                'AttributeName': 'user_name',
                'KeyType': 'RANGE',
            }
        ],
        AttributeDefinitions=[
            {
                'AttributeName': 'id',
                'AttributeType': 'N',
            },
            {
                'AttributeName': 'user_name',
                'AttributeType': 'S',
            },
            {
                'AttributeName': 'age',
                'AttributeType': 'N',
            },
        ],
        ProvisionedThroughput={
            'ReadCapacityUnits': 2,
            'WriteCapacityUnits': 2,
        },
        GlobalSecondaryIndexes=[
            {
                'IndexName': 'age-index',
                'KeySchema': [
                    {
                        'AttributeName': 'age',
                        'KeyType': 'HASH',
                    },
                ],
                'Projection': {
                    'ProjectionType': 'KEYS_ONLY',
                },
                'ProvisionedThroughput': {
                    'ReadCapacityUnits': 2,
                    'WriteCapacityUnits': 2,
                }
            },
        ],
    )

但是,当通过age-index全局二级索引查询表时,我收到以下消息:

Query condition missed key schema element: age

这是我传递给boto3查询方法的参数:

{
'ConsistentRead': False,
'IndexName': 'age-index',
'QueryFilter': {
    'age': {
        'ComparisonOperator': 'GT',
        'AttributeValueList': [18]
    }
},

'TableName': 'table-unittest',
'ScanIndexForward': False,
'KeyConditions': {
    'id': {
        'ComparisonOperator': 'EQ',
        'AttributeValueList': [222]
    }
}

}

1 个答案:

答案 0 :(得分:0)

您无法使用表哈希键作为条件(id)

来查询全局二级索引

你只能:

  1. 仅查询您的全局二级索引(年龄)和按ID
  2. 的应用程序级别筛选
  3. 创建本地二级索引,其中哈希为'id',范围为'age',然后您可以查询id = 222和age = 23
  4. 的位置