Ahora que tiene CategoryIndex, podrá utilizarlo para recuperar todos los libros de una categoría específica. Utilizar un índice secundario para consultar una tabla es parecido a utilizar la llamada a la API Query . Ahora se agrega el nombre del índice a la llamada a la API.
Al agregar un índice secundario global a una tabla existente, DynamoDB rellena de manera asíncrona el índice con los elementos existentes en la tabla. Tras la replicación de todos los elementos, el índice queda disponible para las consultas. La duración de la replicación varía en función del tamaño de la tabla.
Puede utilizar el script query_with_index.py para consultar el nuevo índice. Ejecute el script en su terminal con el siguiente comando.
$ python query_with_index.py
El comando ejecuta el siguiente script para recuperar todos los libros en la tienda que pertenecen a la Categoría de Suspenso.
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)
Observe que una parte del script espera hasta que el índice esté disponible para las consultas.
Debe ver los siguientes resultados en la 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 consulta arroja tres libros escritos por dos autores diferentes. Este es un patrón de consulta que habría sido difícil de obtener con el esquema de la clave principal de la tabla, pero es fácil de implementar gracias a las capacidades de los índices secundarios.
En el siguiente módulo, aprenderá a actualizar los atributos de un elemento existente en una tabla mediante la API UpdateItem.