2016-06-17 17 views
5

パッケージboto3 - Python用のAmazonの公式AWS APIラッパー - DynamoDBに一括してアイテムをアップロードするための優れたサポートがあります。それは次のようになります。ここではバッチ取得要求をAWS DynamoDBに送信するためのPython APIはありますか?

db = boto3.resource("dynamodb", region_name = "my_region").Table("my_table") 

with db.batch_writer() as batch: 
    for item in my_items: 
     batch.put_item(Item = item) 

my_itemsは、テーブルの主キー(複数可)を持っている必要がありますそれぞれのPythonの辞書のリストです。状況は完璧ではありません。たとえば、スループットの限界を超えないようにするための安全機構はありませんが、それでもかなり良いです。

ただし、データベースからの読み取りに対応するものはありません。私が見つけやすいのはDynamoDB.Client.batch_get_item()ですが、ここではAPIは非常に複雑です。

db_client = boto3.client("dynamodb", "my_region") 

db_client.batch_get_item(
    RequestItems = { 
     "my_table": { 
      "Keys": [ 
       {"my_primary_key": {"S": "my_key1"}}, 
       {"my_primary_key": {"S": "my_key2"}} 
      ] 
     } 
    } 
) 

これは許容できるかもしれませんが、応答は同じ問題があります:ここでは、2つの項目を要求すると、次のようになります。すべての値は、キーのデータ型(マッピングの数の文字列の"S""N""M"ている辞書ですが、など)、すべてを解析する必要があるのはちょっと面倒です。だから、私の質問は以下のとおりです。

上記batch_writer機能と同様DynamoDBのからの読み取りバッチの任意のネイティブboto3サポートは、ありますか?それに失敗

boto3は自動的にDynamoDB.Client.batch_get_item()機能への応答をデシリアライズするための任意の組み込みの方法を提供していますか?

また、入力または出力にタイプパージングが必要ないという点で、私が "正しい" APIと考えている機能が追加されています。だから、これは開発者の何らかの見落としであり、私は回避策を探していると思います。

答えて

2

だからありがたいことに、あなたが有用見つけるかもしれない何かがある - 多くのjson.dumpsjson.loadsを持ってjsonモジュールなどは、boto3は、シリアライザとデシリアライザを含み種類のモジュールがあります。 TypeSerializer/TypeDeserializerを参照してください。ソースコードを見ると、シリアライゼーション/デシリアライゼーションは再帰的であり、ユースケースには完璧でなければなりません。

注:往復変換に通常の古いpython float/intを使用するのではなく、Binary/Decimalを使用することをお勧めします。

serializer = TypeSerializer() 
serializer.serialize('awesome') # returns {'S' : 'awesome' } 

deser = TypeDeserializer() 
deser.deserialize({'S' : 'awesome'}) # returns u'awesome' 

うまくいけば、これが役立ちます。

+0

これは良いようです!私はこれがほとんどの痛みを取り除くだろうと思う。ありがとうございました – mark

1

サービスリソースレベルはbatch_get_itemです。たぶんあなたはそのようなことをすることができます:

def batch_query_wrapper(table, key, values): 

    results = [] 

    response = dynamo.batch_get_item(RequestItems={table: {'Keys': [{key: val} for val in values]}}) 
    results.extend(response['Responses'][table]) 

    while response['UnprocessedKeys']: 

     # Implement some kind of exponential back off here 
     response = dynamo.batch_get_item(RequestItems={table: {'Keys': [{key: val} for val in values]}}) 
     results.extend(response['Response'][table]) 

    return results 

あなたの結果をpythonオブジェクトとして返します。

関連する問題