Jetzt, wo Sie den CategoryIndex haben, können Sie damit alle Bücher mit einer bestimmten Kategorie abrufen. Die Verwendung eines Sekundärindexes zum Abfragen einer Tabelle ähnelt der Verwendung des Abfrage-API-Aufrufs. Jetzt fügen Sie den Indexnamen zum API-Aufruf hinzu.
Wenn Sie einer vorhandenen Tabelle einen globalen Sekundärindex hinzufügen, füllt DynamoDB den Index asynchron mit den vorhandenen Elementen in der Tabelle. Der Index kann abgefragt werden, nachdem alle Elemente nachgefüllt wurden. Die Zeit zum Auffüllen hängt von der Größe der Tabelle ab.
Sie können das Skript query_with_index.py verwenden, um den neuen Index abzufragen. Führen Sie dieses Skript mit dem folgenden Befehl in Ihrem Terminal aus:
$ python query_with_index.py
Dieser Befehl führt das folgende Skript aus, um alle Bücher im Geschäft abzurufen, die die Kategorie Spannung haben.
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)
Beachten Sie, dass ein Teil des Skripts wartet, bis der Index zum Abfragen verfügbar ist.
Sie sollten die folgende Ausgabe in Ihrem Terminal sehen:
$ 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'}
Die Abfrage gibt drei Bücher von zwei verschiedenen Autoren zurück. Dies ist ein Abfragemuster, das mit dem Hauptschlüsselschema Ihrer Tabelle schwierig gewesen wäre, aber mit der Leistung von Sekundärindizes einfach zu implementieren ist.
Im nächsten Modul erfahren Sie, wie Sie die Attribute eines vorhandenen Elements in einer Tabelle mithilfe der UpdateItem-API aktualisieren.