it-swarm.com.ru

Как мы запрашиваем вторичный индекс DynamodB, используя boto3?

Есть ли способ сделать запрос к global secondary index из DynamodB, используя boto3. Я не нахожу никаких онлайн-учебников или ресурсов. 

20
ZZzzZZzz

Вам необходимо предоставить параметр IndexName для функции query

Этоname индекса , который обычно отличается от имени индекса attribute(имя индекса по умолчанию имеет суффикс -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)
)

Чтобы проверить индексное имя , перейдите на вкладку Indexes таблицы в веб-интерфейсе AWS. Вам понадобится значение из столбца Name.

54
Attila Tanyi

Для любого, кто использует клиент 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': '[email protected]',
       },
   },
   KeyConditionExpression='emailField = :v1',
)

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

first_item = items[0]
2
Gaz_Edge

Добавляем обновленную технику:

    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]

0
Matt Holmes