![](/img/trans.png)
[英]DynamoDB - Querying Partitions that have Records with different Partitions Key Values
[英]How to query dynamodb where I have fetch records based on a list of key values?
我有一個 dynamodb 表,在該表上使用分區鍵和排序鍵定義了 GSI。
假設分區鍵是name
,排序鍵是 GSI 的ssn
。
我必須根據名稱和 ssn 獲取,下面是我正在使用的查詢,它工作正常。
table.query(IndexName='lookup-by-name',KeyConditionExpression=Key('name').eq(name)\
& Key('ssn').eq(ssn))
現在,我必須根據名稱和 ssns 列表進行查詢。
例如
ssns=['ssn1','ss2','ss3',ssn4']
name='Alex'
查詢名稱為“Alex”且其 ssn 存在於 ssns 列表中的所有記錄。
我該如何實施這樣的事情?
雖然 DynamoDB 本機 SDK 無法提供執行此操作的功能,但您可以使用 PartiQL 實現它,它提供了一個類似於 SQL 的接口來與 DynamoDB 進行交互。
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-gettingstarted.html
import boto3
client = boto3.client('dynamodb', region_name="eu-west-1")
name = 'Alex'
ssns = ['ssn1','ssn2','ssn3','ssn4']
response = client.execute_statement(
Statement = "Select * from \"MyTableTest\".\"lookup-by-name\" where \"name\" = '%s' AND \"ssn\" IN %s" % (name, ssns)
)
print(response['Items'])
它還會要求您使用較低級別的Client
而不是您在上面使用的Table
級別資源。
您將不得不進行多次查詢。
最后僅使用名稱作為關鍵條件,然后在 python 代碼中過濾掉 ssn。
下面對我有用,因為記錄的數量不是很多。
response=table.query(IndexName='lookup-by-name',KeyConditionExpression=Key('name').eq(name)
ssns=['ssn1','ss2','ss3',ssn4']
data= response['Items']
data=list(filter(lambda record: record['ssn'] in ssns,data))
return data
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.