我们如何使用boto3查询dynamodb的二级索引?

时间:2016-03-02 21:56:38

标签: amazon-web-services amazon-dynamodb boto3

有没有办法使用global secondary index查询dynamodb的boto3。我找不到任何在线教程或资源。

4 个答案:

答案 0 :(得分:59)

您需要为IndexName函数提供query参数。

这是索引的 名称 ,通常不同于索引属性的名称 (默认情况下,索引的名称后缀为-index,尽管您可以在创建表时更改它。例如,如果您的索引属性名为video_id,则索引名称可能为video_id-index

import boto3
from boto3.dynamodb.conditions import Key
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('videos')
video_id = 25
response = table.query(
    IndexName='video_id-index',
    KeyConditionExpression=Key('video_id').eq(video_id)
)

要检查索引名称,请转到AWS Web界面上表格的Indexes标签。您需要Name列中的值。

答案 1 :(得分:3)

对于使用boto3客户端的任何人,以下示例应该有效:

import boto3    

# for production
client = boto3.client('dynamodb')

# for local development if running local dynamodb server
client = boto3.client(
   'dynamodb',
   region_name='localhost',
   endpoint_url='http://localhost:8000'
)

resp = client.query(
   TableName='UsersTabe',
   IndexName='MySecondaryIndexName',
   ExpressionAttributeValues={
       ':v1': {
           'S': 'some@email.com',
       },
   },
   KeyConditionExpression='emailField = :v1',
)

# will always return list
items = resp.get('Items')

first_item = items[0]

答案 2 :(得分:0)

添加更新的技术:

    import boto3
    from boto3.dynamodb.conditions import Key, Attr

    dynamodb = boto3.resource(
         'dynamodb',
         region_name='localhost',
         endpoint_url='http://localhost:8000'
    )

    table = dynamodb.Table('userTable')

    attributes = table.query(
        IndexName='UserName',
        KeyConditionExpression=Key('username').eq('jdoe')
    )
    if 'Items' in attributes and len(attributes['Items']) == 1:
        attributes = attributes['Items'][0]

答案 3 :(得分:0)

之所以有这么多问题,是因为通过boto3调用发电机不是直观。我使用dynamof库使这种事情变得更加常识。使用dynamof,呼叫看起来像这样。

from dynamof.operations import query
from dynamof.conditions import attr

query(
    table_name='users',
    conditions=attr('role').equals('admin'),
    index_name='role_lookup_index')

https://github.com/rayepps/dynamof

免责声明:我写了dynamof