Artık CategoryIndex’e sahip olduğunuza göre, bunu kullanarak belirli bir kategorideki tüm kitapları alabilirsiniz. Bir tabloyu sorgulamak için ikincil dizin kullanmak, Query API çağrısını kullanmaya benzerdir. Şimdi dizin adını API çağrısına ekliyorsunuz.
Mevcut tabloya bir küresel ikincil dizin eklediğinizde DynamoDB, dizini tablodaki mevcut öğelerle zaman uyumsuz olarak geri doldurur. Tüm öğeler geri doldurulduktan sonra dizin sorgulamaya hazır hale gelir. Geri doldurma zamanı, tablonun boyutuna göre değişiklik gösterir.
Yeni dizine göre sorgulama yapmak için query_with_index.py betiğini kullanabilirsiniz. Betiği aşağıdaki komutla terminalinizde çalıştırın:
$ python query_with_index.py
Bu komut, aşağıdaki betiği çalıştırarak mağazadaki Suspense Category içinde yer alan tüm kitapları alır.
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)
Betiğin, dizin sorgulamaya hazır hale gelene kadar bekleyen bir kısmı olduğunu unutmayın.
Terminalinizde aşağıdaki çıktıları görmeniz gerekir.
$ 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'}
Sorgulama sonucunda iki farklı yazara ait üç kitap bulunmuştur. Bu, tablonuzun ana anahtar şeması ile zor ancak ikincil dizinlerin sağladığı güç ile kolay uygulanacak bir sorgulama modelidir.
Bir sonraki modülde, bir tabloda yer alan mevcut bir öğenin özniteliklerini UpdateItem API’sini kullanarak nasıl güncelleyebileceğinizi öğreneceksiniz.