web-dev-qa-db-fra.com

Comment interroge-t-on un index secondaire de dynamodb en utilisant boto3?

Existe-t-il un moyen d'interroger le global secondary index de dynamodb à l'aide de boto3. Je ne trouve pas de tutoriels ou de ressources en ligne. 

20
ZZzzZZzz

Vous devez fournir un paramètre IndexName pour la fonction query

Il s’agit du nom de l’index _, qui est généralement différent de nom de l’index attribut (le nom de l’index porte le suffixe -index par par défaut, bien que vous puissiez le changer lors de la création de la table). Par exemple, si votre attribut d'index est appelé video_id, votre nom d'index est probablement 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)
)

Pour vérifier le nom d'index, accédez à l'onglet Indexes de la table sur l'interface Web d'AWS. Vous aurez besoin d'une valeur de la colonne Name.

54
Attila Tanyi

Pour tous ceux qui utilisent le client boto3, l'exemple ci-dessous devrait fonctionner: 

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

Ajout de la technique mise à jour:

    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