2012-10-31 35 views
5

Làm cách nào để phân trang kết quả của tôi từ DynamoDB bằng thư viện python Boto? Từ tài liệu API Boto, tôi không thể tìm hiểu xem nó có hỗ trợ phân trang hay không, mặc dù API DynamoDB không hỗ trợ phân trang.Phân trang trong Amazon DynamoDB bằng Boto

Trả lời

7

Boto không hỗ trợ "phân trang" như hành vi sử dụng kết hợp "ExclusiveStartKey" và "Limit". Ví dụ: để phân trang Scan.

Dưới đây là một ví dụ mà nên phân tích một bảng toàn bởi khối 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:

Như đã chỉ ra bởi @garnaat, có thể là tôi hiểu lầm mục tiêu thực tế của bạn. Đề xuất trên cho phép bạn cung cấp phân trang như SO cho câu hỏi chẳng hạn. Không quá 15 mỗi trang.

Nếu bạn chỉ cần một cách để tải toàn bộ tập kết quả được tạo bởi một Scan, Boto là một thư viện tuyệt vời và đã tóm tắt điều này cho bạn mà không cần ma thuật đen như trong câu trả lời của tôi. Trong trường hợp này, bạn nên làm theo những gì anh ta (@garnaat) khuyên. Btw, ông là tác giả của Boto và, như vậy, một tài liệu tham khảo tuyệt vời cho các câu hỏi liên quan đến Boto :)

+0

Cảm ơn, công trình này hoạt động. Tôi đoán tôi đã tìm cách để có được exclusive_start_key. Btw bạn có thể có một lúng túng khác trong mã. –

+0

Tôi biết câu lệnh "else" có vẻ lạ;) Nhưng trên thực tế, nó được kích hoạt khi vòng lặp "for" thực hiện chính xác 0 lần lặp. http://psung.blogspot.ca/2007/12/for-else-in-python.html – yadutaf

+0

Tôi không biết về điều đó. Cảm ơn! –

3

Có lẽ tôi hiểu nhầm câu hỏi nhưng tôi nghĩ rằng bạn đang làm cho nó khó khăn hơn nó cần. Nếu bạn đang sử dụng giao diện DynamoDB lớp 2 trong boto (mặc định), nó xử lý việc phân trang cho bạn.

Vì vậy, nếu bạn muốn làm một thao tác truy vấn, bạn chỉ cần làm điều này:

import boto 

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

này sẽ tự động xử lý các pagination kết quả từ DynamoDB. Tương tự cũng sẽ làm việc cho một yêu cầu quét.

+0

Có lẽ tôi không hiểu điều gì đó, nhưng điều này chỉ cho phép để có được tất cả các mục một. Những gì tôi muốn là để có được thứ N "trang", nơi một "trang" có K mục. Điều này có thể được thực hiện mà không cần phải đọc tất cả (N-1) * K trước mục (một lần nữa và một lần nữa, đó là O (N^2))? Xin vui lòng, tôi sẽ đánh giá cao câu trả lời của bạn làm thế nào để có được trực tiếp pageN. –

+0

Nếu tôi hiểu chính xác, để hoàn thành những gì bạn đã mô tả, bạn sẽ tạo tài nguyên con bằng cách sử dụng Tham số đường dẫn URL hoặc Tham số chuỗi truy vấn URL. Khi đã được cấu hình (Yêu cầu tích hợp - ánh xạ cơ thể và ánh xạ params), bạn sẽ có thể có được các kết quả cụ thể dựa trên các tham số mà bạn chuyển tới tài nguyên (và do đó phương thức). Tôi biết bài đăng này cũ, nhưng có thể giúp những người đang tìm kiếm trợ giúp ngay bây giờ. – Ephexx

0

có một cơ hội tốt bạn muốn một cái gì đó như thế này:

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 

của khóa học này là một ví dụ ngớ ngẩn cho cuộc biểu tình.
Chìa khóa ở đây là sử dụng last_evaluated_key không phải là exclusive_start_key

Các vấn đề liên quan