簡體   English   中英

使用 KeyConditionExpression 的 boto3 查詢

[英]boto3 query using KeyConditionExpression

我無法理解為什么下面對 DynamoDB 表的查詢不起作用:

dict_table.query(KeyConditionExpression='norm = :cihan', ExpressionAttributeValues={':cihan': {'S': 'cihan'}})

並拋出此錯誤:

ClientError: An error occurred (ValidationException) when calling the Query operation: One or more parameter values were invalid: Condition parameter type does not match schema type

而以下工作:

dict_table.query(KeyConditionExpression=Key('norm').eq('cihan'))

norm是一個字符串類型的字段。 我正在使用 boto3 v 1.4.0 並遵循文檔

In [43]: boto3.__version__
Out[43]: '1.4.0'

誰能看到第一個查詢中的錯誤是什么?

額外的問題:所有的代幣是什么以及需要一直替換它們? 為什么我不能只說dict_table.query(KeyConditionExpression='norm = cihan')

請按如下所述更改 ExpressionAttributeValues。

ExpressionAttributeValues={':cihan': 'cihan'}

在當前版本的 boto3 (1.9.128) 中,問題中提到的查詢工作正常,除此之外沒有其他工作,下面提到的查詢對我有用:-

dynamo_client.query( KeyConditionExpression='campaign_id = :201906', ExpressionAttributeValues={':201906': {'S': '201906'}} )

獎金問題...

為了回答您的額外問題,所有令牌都是 dynamo 的一個抽象層,用於確保在與其通信時發出的 http 請求之間的類型一致性。 使用標准的 http/json 在“2”和 2 等情況下存在歧義的空間。因此,dynamo 強制客戶端將值包裝在專門定義其類型的對象中。

回到最初的問題...

話雖如此…… boto3 API 並沒有為您抽象出來,這有點荒謬。 雖然我可以理解它有點超出 boto3 工具的范圍。 一個名為dynamof的庫有希望 使用它,您的查詢將如下所示:

from boto3 import client
from dynamof import db as make_db
from dynamof import query

client = client('dynamodb', endpoint_url='http://localstack:4569')
db = make_db(client)

results = db(query(
    table_name='dict_table',
    conditions=attr('norm').equals('cihan')
))

您可以獲得相同的簡單 API,用於在其他常用操作(例如創建表、添加項目、更新、刪除和掃描)中發出 dynamo 請求。 現在有更多的操作和功能在開發中。

免責聲明:我寫了dynamof

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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