2012-10-31 7 views
5

Wie paginiere ich meine Ergebnisse von DynamoDB mit der Boto Python-Bibliothek? Aus der Boto-API-Dokumentation kann ich nicht herausfinden, ob es sogar Seitenumbrüche unterstützt, obwohl die DynamoDB-API Paginierungsunterstützung bietet.Seitenumbruch in Amazon DynamoDB mit Boto

Antwort

7

Boto unterstützt das "Pagination" -ähnliche Verhalten mit einer Kombination aus "ExclusiveStartKey" und "Limit". Zum Beispiel, um Scan zu paginieren.

Hier ist ein Beispiel dafür ist, dass eine ganze Tabelle von Brocken von 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 analysieren sollte:

Wie von @garnaat ist es möglich, dass ich falsch verstanden Ihr eigentliches Ziel. Mit dem obigen Vorschlag können Sie Seitenumbrüche wie SO für Fragen bereitstellen. Nicht mehr als 15 pro Seiten.

Wenn Sie nur eine Möglichkeit brauchen, um das gesamte Ergebnis von Scan zu laden, ist Boto eine großartige Bibliothek und abstrahiert diese für Sie ohne schwarze Magie wie in meiner Antwort. In diesem Fall solltest du dem folgen, was er (@garnaat) rät. Btw, er ist der Autor von Boto und als solcher eine gute Referenz für Boto verwandte Fragen :)

+0

Danke, das funktioniert. Ich denke, ich suchte nach dem exclusive_start_key. Übrigens könntest du sonst noch im Code herumhängen. –

+0

Ich weiß, die "else" -Anweisung scheint komisch;) Aber eigentlich wird es ausgelöst, wenn die "for" -Schleife genau 0 Iterationen gemacht hat. http://psung.blogspot.ca/2007/12/for-else-in-python.html – yadutaf

+0

Ich wusste nicht darüber. Vielen Dank! –

3

Vielleicht bin ich Missverständnis die Frage, aber ich denke, Sie machen es schwieriger, als es sein muss. Wenn Sie die DynamoDB-Schnittstelle von Layer2 in Boto (Standardeinstellung) verwenden, wird die Paginierung für Sie übernommen.

Also, wenn Sie eine Abfrage Operation tun möchten, können Sie dies einfach tun:

import boto 

c = boto.connect_dynamodb() 
t = c.get_table('mytable') 
for item in t.query(hash_key='foo'): 
    print item 

Dadurch wird automatisch die Paginierung der Ergebnisse aus DynamoDB handhaben. Das gleiche würde auch für eine Scan-Anfrage funktionieren.

+0

Vielleicht verstehe ich etwas nicht, aber das erlaubt nur alle Elemente eins nach dem anderen zu bekommen. Was ich will, ist, die Nth "Seite" zu bekommen, wo eine "Seite" K Items hat. Kann dies gemacht werden, ohne alle (N-1) * K vorhergehenden Punkte lesen zu müssen (immer wieder, was ist O (N^2))? Bitte, ich würde Ihre Antwort schätzen, wie man direkt pageN erhält. –

+0

Wenn ich richtig verstehe, um das zu erreichen, was Sie beschrieben haben, würden Sie eine untergeordnete Ressource mit URL-Pfad-Parametern oder URL-Abfrage-String-Parametern erstellen. Nach der Konfiguration (Integrationsanforderung - body mapping und params mappings) sollten Sie in der Lage sein, bestimmte Ergebnisse basierend auf den Parametern zu erhalten, die Sie an die Ressource (und somit an die Methode) übergeben. Ich weiß, dass dieser Beitrag alt ist, kann aber denjenigen helfen, die jetzt Hilfe suchen. – Ephexx

0

gibt es eine gute Chance, dass Sie so etwas wie dies wollen:

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 

natürlich ist dies ein dummes Beispiel für die Demonstration.
Der Schlüssel hier ist zu verwenden last_evaluated_key nicht die exclusive_start_key