Maintenant que vous avez créé CategoryIndex, vous pouvez l'utiliser pour extraire tous les livres appartenant à une catégorie spécifique. Utiliser un index secondaire pour interroger une table revient à utiliser l'appel d'API Query. Maintenant, ajoutez le nom de l'index à l'appel d'API.
Lorsque vous ajoutez un index secondaire global à une table existante, DynamoDB remplit l'index de façon asynchrone avec les éléments existants de la table. L'index est ensuite disponible pour interroger tous les éléments qui ont été remplis. Le temps de remplissage varie en fonction de la taille de la table.
Vous pouvez utiliser le script query_with_index.py pour interroger le nouvel index. Exécutez le script dans votre terminal avec la commande suivante.
$ python query_with_index.py
Cette commande permet d'exécuter le script suivant pour extraire tous les livres disponibles qui appartiennent à la Catégorie Suspense.
import time
import boto3
from boto3.dynamodb.conditions import Key
# Boto3 is the AWS SDK library for Python.
# The "resources" interface allows for a higher-level abstraction than the low-level client interface.
# For more details, go to http://boto3.readthedocs.io/en/latest/guide/resources.html
dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
table = dynamodb.Table('Books')
# When adding a global secondary index to an existing table, you cannot query the index until it has been backfilled.
# This portion of the script waits until the index is in the “ACTIVE” status, indicating it is ready to be queried.
while True:
if not table.global_secondary_indexes or table.global_secondary_indexes[0]['IndexStatus'] != 'ACTIVE':
print('Waiting for index to backfill...')
time.sleep(5)
table.reload()
else:
break
# When making a Query call, you use the KeyConditionExpression parameter to specify the hash key on which you want to query.
# If you want to use a specific index, you also need to pass the IndexName in our API call.
resp = table.query(
# Add the name of the index you want to use in your query.
IndexName="CategoryIndex",
KeyConditionExpression=Key('Category').eq('Suspense'),
)
print("The query returned the following items:")
for item in resp['Items']:
print(item)
Notez qu'une partie du script attend que l'index soit disponible pour lancer l'interrogation.
Vous obtiendrez la sortie suivante dans votre terminal.
$ python query_with_index.py
The query returned the following items:
{'Title': 'The Firm', 'Formats': {'Hardcover': 'Q7QWE3U2', 'Paperback': 'ZVZAYY4F', 'Audiobook': 'DJ9KS9NM'}, 'Author': 'John Grisham', 'Category': 'Suspense'}
{'Title': 'The Rainmaker', 'Formats': {'Hardcover': 'J4SUKVGU', 'Paperback': 'D7YF4FCX'}, 'Author': 'John Grisham', 'Category': 'Suspense'}
{'Title': 'Along Came a Spider', 'Formats': {'Hardcover': 'C9NR6RJ7', 'Paperback': '37JVGDZG', 'Audiobook': '6348WX3U'}, 'Author': 'James Patterson', 'Category': 'Suspense'}
La requête remonte trois livres écrits par deux auteurs différents. Ceci est un modèle d'interrogation qui aurait été difficile avec le schéma de clé principale de votre table, mais qui est facile à implémenter grâce à la puissance des index secondaires.
Dans le prochain module, vous apprendrez à mettre à jour les attributs d'un élément existant dans une table en utilisant l'API UpdateItem.