[英]Using both AttributesToGet and KeyConditionExpression with boto3 and dynamodb
[英]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.