2017-02-06 3 views
1

그래서 주 파티션 키 열 foo_id 및 기본 정렬 키가있는 dynamodb 테이블이 있습니다. 나는 foo_id 값 목록을 가지고 있으며,이 ID 목록과 관련된 관찰을 원합니다.기본 파티션 키 값의 목록이 주어진 경우 많은 항목을 한 번에 batch_get_item하는 방법

이 작업을 수행하는 가장 좋은 방법은 (?) batch_get_item()을 사용하는 것으로 생각했지만 효과가 없습니다.

# python code 
    import boto3 
    client = boto3.client('dynamodb') 

    # ppk_values = list of `foo_id` values (strings) (< 100 in this example) 
    x = client.batch_get_item(
     RequestItems={ 
      'my_table_name': 
       {'Keys': [{'foo_id': {'SS': [id for id in ppk_values]}}]} 
     }) 

내가 (foo_id 값 목록) 문자열 목록을 전달 해요 때문에 나는 SS을 사용하고 있습니다,하지만 난 받고 있어요 :

ClientError: An error occurred (ValidationException) when calling the 
BatchGetItem operation: The provided key element does not match the 
schema 

그래서 나는 그것을 foo_id에 포함 된 생각을 의미 가정 문자열 값 대신 값을 나열합니다. 이는 잘못되었습니다.

-> 그 해석이 맞습니까? 여러 주 파티션 키 값을 일괄 적으로 쿼리하는 가장 좋은 방법은 무엇입니까?

답변

2

키는 다음과 같이 지정해야합니다. 그것은 'SS'로 언급 될 수 없습니다.

기본적으로 DynamoDB String 데이터 유형을 String (SS가 아닌)과 비교할 수 있습니다. 각 항목은 별도로 처리됩니다. 쿼리에서 SQL과 비슷하지 않은 것은 입니다.

'Keys': [ 
        { 
         'foo_id': key1 
        }, 
        { 
         'foo_id': key2 
        }, 
       ], 

샘플 코드 : -

당신은 테이블 이름과 키 값을 변경해야 할 수도 있습니다.

from __future__ import print_function # Python 2/3 compatibility 
import boto3 
import json 
import decimal 
from boto3.dynamodb.conditions import Key, Attr 
from botocore.exceptions import ClientError 

# Helper class to convert a DynamoDB item to JSON. 
class DecimalEncoder(json.JSONEncoder): 
    def default(self, o): 
     if isinstance(o, decimal.Decimal): 
      if o % 1 > 0: 
       return float(o) 
      else: 
       return int(o) 
     return super(DecimalEncoder, self).default(o) 

dynamodb = boto3.resource("dynamodb", region_name='us-west-2', endpoint_url="http://localhost:8000") 

email1 = "[email protected]" 
email2 = "[email protected]" 

try: 
    response = dynamodb.batch_get_item(
    RequestItems={ 
     'users': { 
      'Keys': [ 
       { 
        'email': email1 
       }, 
       { 
        'email': email2 
       }, 
      ],    
      'ConsistentRead': True    
     } 
    }, 
    ReturnConsumedCapacity='TOTAL' 
) 
except ClientError as e: 
    print(e.response['Error']['Message']) 
else: 
    item = response['Responses'] 
    print("BatchGetItem succeeded:") 
    print(json.dumps(item, indent=4, cls=DecimalEncoder)) 
+0

위의 대답은 방법 batch_get_item은 클라이언트에없는 자원에 존재하는 우리가, dynamodb.meta.client.batch_get_item하는 dynamodb.batch_get_item을 변경 한 후에 만 ​​작동합니다. –