Как мы запрашиваем вторичный индекс Dynamodb с помощью boto3?

Есть ли вообще способ запросить global secondary index Dynamodb с помощью boto3. Я не нахожу онлайн-руководств или ресурсов.


person ZZzzZZzz    schedule 02.03.2016    source источник


Ответы (4)


Вам необходимо предоставить параметр 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)
)

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

person Attila Tanyi    schedule 26.04.2016
comment
при использовании клиента boto3 см. ответ ниже stackoverflow.com/a/50122093/1085343 Я не могу получить ключ (). eq ( ) работать по какой-то причине - person Gaz_Edge; 01.05.2018
comment
Работайте как шарм, также это лаконичный способ делать вещи. - person severin.julien; 20.06.2018
comment
Работал у меня. Помните, что GSI должен иметь желаемый ключ раздела (например, video_id) - person William Choy; 25.09.2019

Для всех, кто использует клиент 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]
person Gaz_Edge    schedule 01.05.2018
comment
Чтобы Key() заработал, вам нужно использовать boto3.resource более высокого уровня, а затем объект Table, а не boto3.client. Вам также необходимо импортировать KeyAttr при необходимости) из boto3.dynamodb.conditions. Здесь трудно найти документацию по этому поводу: boto3.amazonaws.com/v1/documentation/api/latest/reference/ Самое приятное в Key состоит в том, что он генерирует KeyConditionExpression для вас без необходимости также определять ExpressionAttributeValues и ExpressionAttributeNames - person Davos; 21.11.2018

Добавление обновленной техники:

    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]

person Matt Holmes    schedule 15.02.2019

Таких вопросов очень много, потому что вызов динамо через 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

person rayepps    schedule 01.02.2020