2016-06-17 47 views
5

Il pacchetto boto3 - Il wrapper API AWS ufficiale di Amazon per python - ha un ottimo supporto per il caricamento di elementi su DynamoDB alla rinfusa. Ecco come si presenta:Esiste un'API Python per l'invio di richieste di acquisizione batch ad AWS DynamoDB?

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) 

Qui my_items è una lista di dizionari Python ognuno dei quali deve avere la chiave primaria della tabella (s). La situazione non è perfetta - ad esempio, non esiste un meccanismo di sicurezza che ti impedisca di superare i tuoi limiti di rendimento - ma è comunque abbastanza buono.

Tuttavia, non sembra esserci alcuna controparte per la lettura dal database. Il più vicino che riesco a trovare è DynamoDB.Client.batch_get_item(), ma qui l'API è estremamente complicata. Ecco cosa si richiede due elementi sembra:

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"}} 
      ] 
     } 
    } 
) 

Questo potrebbe essere tollerabile, ma la risposta ha lo stesso problema: tutti i valori sono dizionari le cui chiavi sono i tipi di dati ("S" per le stringhe, "N" per il numero, "M" per la mappatura, ecc.) ed è più che un po 'fastidioso dover analizzare tutto. Quindi le mie domande sono:

C'è boto3 supporto nativo per lotti la lettura da DynamoDB, simile alla funzione batch_writer di cui sopra?

In mancanza di questo,

Vuol boto3 forniscono alcun modo incorporato per deserializzare automaticamente le risposte alla funzione di DynamoDB.Client.batch_get_item()?

te lo anche aggiungere che la funzione boto3.resource("dynamodb").Table().get_item() trovi quello che io considero l'API "corretta", in quanto nessun tipo di analisi è necessaria per ingressi o uscite. Quindi sembra che questa sia una sorta di supervisione da parte degli sviluppatori, e suppongo che stia cercando una soluzione alternativa.

risposta

2

ma per fortuna c'è qualcosa che si potrebbe trovare utile - tanto come il modulo json che ha json.dumps e json.loads, boto3 dispone di un modulo tipo che include un serializzatore e deserializzatore. Vedi TypeSerializer/TypeDeserializer. Se si guarda il codice sorgente, la serializzazione/deserializzazione è ricorsiva e dovrebbe essere perfetta per il proprio caso d'uso.

Nota: Si consiglia di utilizzare Binary/Decimal invece di utilizzare solo un vecchio normale float/int python per le conversioni di andata e ritorno.

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

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

Speriamo che questo aiuti!

+0

questo sembra buono! Penso che questo tolga molti punti dolenti. grazie – mark

1

C'è il livello di risorsa di servizio batch_get_item. Forse potresti fare qualcosa del genere:

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 

Restituirà il risultato come oggetti python.