簡體   English   中英

Python - 如何使用主鍵和排序鍵在 GSI 上查詢 DynamoDB

[英]Python - How to query DynamoDB on GSI using primary and sort key

好吧,正如標題所示,我想使用帶有主鍵和排序鍵(均來自 GSI)的 GSI 來查詢我的 DynamoDB 表。 我嘗試了一些方法來做到這一點,但沒有成功。

我有一個帶有url-date-index的表, url是來自 GSI 的主鍵,而date是排序鍵。

我嘗試了以下方法:

  1. 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)
)
  1. 使用KeyConditionExpressionFilterExpression

    這檢索到以下錯誤: 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)
)
  1. 使用ExpressionAttributeNamesExpressionAttributeValuesKeyConditionExpression

    這返回了任何東西,甚至不是與桌子上的urldate匹配的項目。

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 ,因為您的屬性名稱urldate是 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 ( IndexNameKeyConditionExpression ,...)。

讓我們嘗試將名為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM