Есть ли вообще способ запросить global secondary index
Dynamodb с помощью boto3
. Я не нахожу онлайн-руководств или ресурсов.
Как мы запрашиваем вторичный индекс Dynamodb с помощью boto3?
Ответы (4)
Вам необходимо предоставить параметр IndexName
для функции query
.
Это имя индекса, которое обычно отличается от имени атрибута индекса (имя индекса по умолчанию имеет суффикс -index
, хотя вы можете изменить его при создании таблицы). Например, если ваш атрибут индекса называется video_id
, ваше имя индекса, вероятно, будет 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)
)
Чтобы проверить имя индекса, перейдите на вкладку Indexes
таблицы в веб-интерфейсе AWS. Вам понадобится значение из столбца Name
.
Для всех, кто использует клиент boto3, должен работать пример ниже:
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]
Key()
заработал, вам нужно использовать boto3.resource
более высокого уровня, а затем объект Table
, а не boto3.client
. Вам также необходимо импортировать Key
(и Attr
при необходимости) из boto3.dynamodb.conditions
. Здесь трудно найти документацию по этому поводу: boto3.amazonaws.com/v1/documentation/api/latest/reference/ Самое приятное в Key состоит в том, что он генерирует KeyConditionExpression
для вас без необходимости также определять ExpressionAttributeValues
и ExpressionAttributeNames
- person Davos; 21.11.2018
Добавление обновленной техники:
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]
Таких вопросов очень много, потому что вызов динамо через boto3 не интуитивно понятен. Я использую библиотеку dynamof
, чтобы сделать подобные вещи более понятными. При использовании dynamof
вызов выглядит так.
from dynamof.operations import query
from dynamof.conditions import attr
query(
table_name='users',
conditions=attr('role').equals('admin'),
index_name='role_lookup_index')
https://github.com/rayepps/dynamof
отказ от ответственности: я написал Dynamof