是否有任何方法可以使用boto3
查询DynamoDB的全局次要索引(global secondary index)
。我没有找到任何在线教程或资源。
是否有任何方法可以使用boto3
查询DynamoDB的全局次要索引(global secondary index)
。我没有找到任何在线教程或资源。
在使用query
函数时,您需要提供IndexName
参数。
IndexName
是索引的名称,通常与索引属性的名称不同(索引名称默认情况下具有-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)
)
要检查索引名称,请前往AWS网页界面上表格的索引(Indexes)
选项卡。您需要从名称(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': 'some@email.com',
},
},
KeyConditionExpression='emailField = :v1',
)
# will always return list
items = resp.get('Items')
first_item = items[0]
Key()
起作用,你需要使用更高级别的 boto3.resource
和 Table
对象,而不是 boto3.client
。你还需要从 boto3.dynamodb.conditions
中导入 Key
(如果需要还要导入 Attr
)。这里有一些难以找到的文档:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/customizations/dynamodb.html#dynamodb-conditions。`Key` 的好处是,它将为您生成 KeyConditionExpression
,而无需同时定义 ExpressionAttributeValues
和 ExpressionAttributeNames
。 - Davos添加更新的技术:
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调用dynamo不是直观的。我使用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
import boto3
from boto3.dynamodb.conditions import Key
from botocore.exceptions import ClientError
ddb = boto3.resource('dynamodb', region_name='region_like_us_east_1')
index_attribute = None
query_result = []
# assure you had checked table do exist, then to get gsi corresponding index attribute
table_attributes = ddb.meta.client.describe_table(TableName='your table name')
if 'GlobalSecondaryIndexes' in table_attributes['Table'] and len(table_attributes['Table']['GlobalSecondaryIndexes']) > 0:
for each_index in table_attributes['Table']['GlobalSecondaryIndexes']:
if each_index['IndexName'] == 'your gsi':
index_attribute = each_index['KeySchema'][0]['AttributeName']
if index_attribute:
try:
response = ddb.table.query(IndexName='your gsi', KeyConditionExpression=Key(index_attribute).eq('your query value'))
query_result = response['Items']
except ClientError as err:
exception_value = f"Can't query {table_name} by index: {gsi} =={gsi_value}, {err.response['Error']['Code']}: {err.response['Error']['Message']}"
print(exception_value)
raise ValueError(exception_value)
finally:
return query_result
else:
warn_value = f"Can't find the index named as {'your gsi'}"
print(warn_value)
return query_result
Key("SK").eq(my_sk)
来查询,虽然表中肯定存在具有SK的项,但返回的项目数为0。 - 404usernamenotfound