2015-10-22 14 views
5

Tôi đang gặp sự cố khi sử dụng AWS Boto3 để truy vấn DynamoDB bằng khóa băm và khóa phạm vi cùng một lúc bằng cách sử dụng khóa đề nghị KeyConditionExpression. Tôi có kèm theo một truy vấn Ví dụ:Truy vấn DynamoDB bằng khóa băm và phím phạm vi với Boto3

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) 

Khi tôi chạy này chống lại một bảng với các sơ đồ sau:

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

tôi nhận được lỗi sau và tôi không thể hiểu tại sao:

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 

Từ hiểu biết của tôi, loại M sẽ là một loại bản đồ hoặc từ điển và tôi đang sử dụng loại N là loại số và khớp với lược đồ bảng của tôi cho khóa phạm vi. Nếu ai đó có thể giải thích tại sao lỗi này xảy ra hoặc tôi cũng mở cho một cách khác để hoàn thành cùng một truy vấn ngay cả khi bạn không thể giải thích tại sao lỗi này tồn tại.

+0

Bạn có tìm ra điều gì sai với mã của mình không? Tôi đang chạy vào một vấn đề tương tự. – tayfun

Trả lời

14

Các Boto 3 SDK xây dựng một biểu thức Điều kiện cho bạn khi bạn sử dụng các chức năng chính và attr nhập khẩu từ boto3.dynamodb.conditions:

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

) 

tham khảo: http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.04.html

Hy vọng nó giúp

+0

Theo dõi câu hỏi về điều này nhưng bạn có biết nếu có một cách để thực hiện điều đó không? – irregular

+0

Tôi có một danh sách các giá trị băm. Có cách nào tôi có thể tham gia một danh sách với boolean '|' bằng cách sử dụng danh sách hiểu? Một cái gì đó dọc theo dòng ''|' .join ([Key ('hash_key'). Eq (v) cho v trong các giá trị])' – falsePockets

Các vấn đề liên quan