[英]Python - How to query DynamoDB on GSI using primary and sort key
好吧,正如標題所示,我想使用帶有主鍵和排序鍵(均來自 GSI)的 GSI 來查詢我的 DynamoDB 表。 我嘗試了一些方法來做到這一點,但沒有成功。
我有一個帶有url-date-index
的表, url
是來自 GSI 的主鍵,而date
是排序鍵。
我嘗試了以下方法:
將KeyConditionExpression
與&
比較器一起使用:
這個給我找回了錯誤: TypeError: expected string or bytes-like
boto3.resource('dynamodb').Table('table').query(
IndexName='url-date-index',
KeyConditionExpression=conditions.Key('url')).eq(url) & conditions.Key('date')).eq(date)
)
使用KeyConditionExpression
和FilterExpression
:
這檢索到以下錯誤: Filter Expression can only contain non-primary key attributes
boto3.resource('dynamodb').Table('table').query(
IndexName='url-date-index',
KeyConditionExpression=conditions.Key('url')).eq(url),
FilterExpression=conditions.Key('date')).eq(date)
)
使用ExpressionAttributeNames
、 ExpressionAttributeValues
和KeyConditionExpression
:
這返回了任何東西,甚至不是與桌子上的url
和date
匹配的項目。
boto3.resource('dynamodb').Table('table').query(
IndexName='url-date-index',
ExpressionAttributeNames={
'#n0': 'url',
'#n1': 'date'
},
ExpressionAttributeValues={
':v0': url,
':v1': date
},
KeyConditionExpression='(#n0 = :v0) AND (#n1 = :v1)'
)
有誰知道我做錯了什么或者我可以做些什么來完成這項工作。
在您的特定用例中,您需要使用ExpressionAttributeNames
,因為您的屬性名稱url
和date
是 DynamoDB 中的保留字。
DynamoDB docs on querying secondary idnexes提供了一個結構正確的查詢示例,我們可以將其應用於您的情況:
以此為指導,我們可以構建查詢操作的 arguments 應該是什么樣子。 例如
{
"TableName": "table",
"IndexName": "url-date-index",
"KeyConditionExpression": "#pk = :pk And #sk = :sk",
"ExpressionAttributeNames": {"#pk":"url","#sk":"date"},
"ExpressionAttributeValues": {":pk": {"S":url},":sk": {"S":date}}}
}
如果這仍然對您不起作用,請考慮查看NoSQL Workbench For DynamoDB 。 在它的許多有用功能中,它有一個操作構建器,可幫助您使用圖形界面構建 DynamoDB 操作。 您甚至可以針對您的實時數據庫運行該操作。 一旦您的操作按您的意願工作,該工具可以將操作轉換為完整的 Phython、Javascript(Node) 或 Java 代碼示例,您可以使用它來查看操作是如何構建的。
查詢是一個 function ,其中一些名為 arguments ( IndexName
, KeyConditionExpression
,...)。
讓我們嘗試將名為 arguments 的 function 稱為普通 function:
boto3.resource('dynamodb').Table('table').query(
IndexName='url-date-index',
KeyConditionExpression=conditions.Key('url')).eq(url) & conditions.Key('date')).eq(date)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.