2015-10-22 5 views
5

Ich habe Probleme mit AWS Boto3, um DynamoDB mit einem Hash-Schlüssel und einem Bereichsschlüssel gleichzeitig mit der Empfehlung KeyConditionExpression abzufragen. Ich habe ein Beispiel Abfrage angehängt:DynamoDB mit einem Hash-Schlüssel und einem Bereichsschlüssel mit Boto3 abfragen

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) 

Als ich dies für eine Tabelle mit folgendem Schema ausgeführt:

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

ich folgende Fehlermeldung erhalten, und ich kann nicht verstehen, warum:

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 

Aus meiner Sicht wäre der Typ M ein Map- oder Dictionary-Typ und ich verwende einen Typ N, der ein Zahlentyp ist und mit meinem Tabellenschema für den Bereichsschlüssel übereinstimmt. Wenn jemand erklären könnte, warum dieser Fehler auftritt, oder ich auch offen bin für eine andere Art, dieselbe Abfrage auszuführen, auch wenn Sie nicht erklären können, warum dieser Fehler vorliegt.

+0

hilft Hast du herausgefunden, was mit deinem Code nicht stimmt? Ich stoße auf ein ähnliches Problem. – tayfun

Antwort

14

Die Boto 3 SDK erstellt eine Bedingung Expression für Sie, wenn Sie die Taste und Attr Funktionen aus boto3.dynamodb.conditions importiert verwenden:

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

) 

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

Hoffe, dass es

+0

Folgefrage dazu, aber würdest du wissen, ob es eine Möglichkeit gibt, das zu tun? – irregular

+0

Ich habe eine Liste von Hash-Werten. Gibt es eine Möglichkeit, eine Liste mit booleschen '|' mit Listenverständnis zu verbinden? Etwas in der Art von '| '.join ([Key (' hash_key '). Eq (v) für v in values])' – falsePockets

Verwandte Themen