Come faccio a impaginare i miei risultati dal DynamoDB utilizzando la libreria Python Boto? Dalla documentazione API Boto, non riesco a capire se ha anche il supporto per l'impaginazione, anche se l'API DynamoDB ha il supporto impaginazione.paginazione in Amazzonia DynamoDB utilizzando Boto
risposta
Boto gode di sostegno per "impaginazione" come comportamento che utilizza una combinazione di "ExclusiveStartKey" e "Limit". Ad esempio, per impaginare Scan
.
Ecco un esempio che dovrebbe analizzare un intero tavolo da blocchi di 10
esk = None
while True:
# load this batch
scan_generator = MyTable.scan(max_results=10, exclusive_start_key=esk)
# do something usefull
for item in scan_generator:
pass # do something usefull
# are we done yet ?
else:
break;
# Load the last keys
esk = scan_generator.kwargs['exclusive_start_key'].values()
EDIT:
Come sottolineato da @garnaat, è possibile che ho frainteso il vostro obiettivo reale. Il suggerimento di cui sopra consente di fornire l'impaginazione come fa SO per le domande, ad esempio. Non più di 15 per pagina.
Se hai solo bisogno di un modo per caricare l'intero set di risultati prodotto da un dato Scan
, Boto è una grande libreria e già lo riassume per te senza bisogno di magia nera come nella mia risposta. In questo caso, dovresti seguire ciò che lui (@garnaat) consiglia. A proposito, lui è l'autore di Boto e, come tale, un ottimo riferimento per le domande relative a Boto :)
Forse sto fraintendendo la domanda, ma penso che la stiate rendendo più difficile di quanto debba essere. Se stai usando l'interfaccia layer2 DynamoDB in boto (il valore predefinito) gestisce l'impaginazione per te.
Quindi, se si vuole fare un'operazione di query, è sufficiente fare questo:
import boto
c = boto.connect_dynamodb()
t = c.get_table('mytable')
for item in t.query(hash_key='foo'):
print item
Questo gestirà automaticamente l'impaginazione dei risultati di DynamoDB. Lo stesso funzionerebbe anche per una richiesta di scansione.
Forse non capisco qualcosa, ma questo permette di ottenere tutti gli elementi uno per uno. Quello che voglio è ottenere l'ennesima "pagina", in cui una "pagina" contiene elementi K. Questo può essere fatto senza dover leggere tutto (N-1) * K che precede gli elementi (ancora e ancora, che è O (N^2))? Per favore, gradirei la tua risposta su come ottenere direttamente la paginaN. –
Se sto capendo correttamente, per realizzare ciò che hai descritto, avresti creato una risorsa figlio usando i parametri del percorso dell'URL o i parametri della stringa di query dell'URL. Una volta configurati (Richiesta di integrazione - mappatura del corpo e mappature param), dovresti essere in grado di ottenere risultati specifici in base ai parametri che attraversi alla risorsa (e quindi al metodo). So che questo post è vecchio, ma può aiutare chi cerca aiuto ora. – Ephexx
c'è una buona probabilità che si desidera qualcosa di simile:
qms = tms.query(hash_key=415772421368583351, max_results=2, exclusive_start_key=None)
for i in qms:
print i
lek = qms.last_evaluated_key
qms = tms.query(hash_key=415772421368583351, max_results=2, exclusive_start_key=lek)
for i in qms:
print i
naturalmente questo è un esempio stupido per la dimostrazione.
La chiave qui è utilizzare last_evaluated_key
non il exclusive_start_key
Grazie, questo funziona. Immagino che stavo cercando come ottenere l'esclusivo_start_key. A parte il fatto che potresti avere un altro codice nel codice. –
so l'affermazione "altro" sembra strano;) Ma in realtà, viene attivato quando il ciclo "for" ha fatto esattamente 0 iterazioni. http://psung.blogspot.ca/2007/12/for-else-in-python.html – yadutaf
io non lo so. Grazie! –