使用KeyConditionExpression进行boto3查询

时间:2016-09-21 21:31:18

标签: python amazon-web-services amazon-dynamodb boto3

我无法理解为什么以下查询在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和following the docs

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

有人能看到第一个查询中的错误是什么吗?

奖金问题:所有令牌是什么以及需要一直更换它们?为什么我不能只说dict_table.query(KeyConditionExpression='norm = cihan')

3 个答案:

答案 0 :(得分:3)

请更改ExpressionAttributeValues,如下所述。

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

答案 1 :(得分:1)

在当前版本的boto3(1.9.128)中,询问的问题中提到的查询工作正常,并且除此之外没有其他工作,下面提到的查询对我有效:-

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

答案 2 :(得分:0)

奖金问题...

要回答您的奖励问题,所有令牌都是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,用于在其他常用操作(例如创建表,添加项目,更新,删除和扫描)中发出发电机请求。现在,更多的操作和功能正在开发中。

免责声明:我写了dynamof