2015-10-22 103 views
5

我在使用AWS Boto3使用推荐的KeyConditionExpression同时使用散列键和范围键查询DynamoDB时遇到问题。我已经装戴例子查询:使用散列键和带有Boto3的范围键查询DynamoDB

import boto3 
from boto3 import dynamodb 
from boto3.session import Session 
dynamodb_session = Session(aws_access_key_id=AWS_KEY, 
       aws_secret_access_key=AWS_PASS, 
       region_name=DYNAMODB_REGION) 
dynamodb = dynamodb_session.resource('dynamodb') 
table=dynamodb.Table(TABLE_NAME) 
request = { 
    'ExpressionAttributeNames': { 
     '#n0': 'hash_key', 
     '#n1': 'range_key' 
    }, 
    'ExpressionAttributeValues': { 
     ':v0': {'S': MY_HASH_KEY}, 
     ':v1': {'N': GT_RANGE_KEY} 
    }, 
    'KeyConditionExpression': '(#n0 = :v0) AND (#n1 > :v1)', 
    'TableName': TABLE_NAME 
} 
response = table.query(**request) 

当我跑这对一个表具有以下方案:

Table Name: TABLE_NAME 
Primary Hash Key: hash_key (String) 
Primary Range Key: range_key (Number) 

我碰到下面的错误,我不明白为什么:

ClientError: An error occurred (ValidationException) when calling the Query operation: Invalid KeyConditionExpression: Incorrect operand type for operator or function; operator or function: >, operand type: M 

从我的理解,类型M将是一个地图或字典类型,我使用类型N是一个数字类型,并匹配我的表格方案的范围键。如果有人可以解释为什么会出现这种错误,或者我也打算以不同的方式完成相同的查询,即使您无法解释存在此错误的原因。

+0

你知道你的代码有什么问题吗?我遇到了类似的问题。 – tayfun

回答

14

的博托3 SDK构建了一个条件表达了您在使用从boto3.dynamodb.conditions进口的关键和功能的Attr:

response = table.query(
    KeyConditionExpression=Key('hash_key').eq(hash_value) & Key('range_key').eq(range_key_value) 

) 

参考:http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.04.html

希望它可以帮助

+0

跟进有关这个问题,但你知道是否有批量的方法吗? – irregular

+0

我有一个哈希值的列表。有没有什么办法可以使用列表理解来使用布尔'|'来加入列表? ('key'('hash_key')。eq(v)for v in values])' – falsePockets

相关问题