2012-03-28 28 views
11

Tôi cần phải đọc dữ liệu từ tất cả các hàng của một bảng lớn, nhưng tôi không muốn kéo tất cả dữ liệu vào bộ nhớ cùng một lúc. Có một hàm SQLAlchemy sẽ xử lý phân trang không? Tức là, kéo nhiều hàng vào bộ nhớ và sau đó tìm nạp thêm khi cần thiết.SQLAlchemy và paging

Tôi hiểu rằng bạn có thể thực hiện việc này với limitoffsetthis article gợi ý, nhưng tôi không muốn xử lý điều đó nếu tôi không phải làm vậy.

Trả lời

13

Xem this answer. Tóm lại, bạn có thể sử dụng toán tử yield_per.

+0

Dường như hỗ trợ phân trang trong ngữ cảnh hiển thị trang web ... Tôi chỉ đang cố gắng nói chuyện với cơ sở dữ liệu, không có giao diện người dùng. –

+0

Ở lớp cơ sở dữ liệu, lặp lại 'giới hạn' và' offset' thực sự là kịch bản thích hợp nhất, chính xác như được ghi chép ban đầu. Tôi tin rằng lý do ở đây là đó là những gì đang xảy ra với cơ sở dữ liệu _anyway_, do đó, bạn cũng có thể cung cấp vòng lặp 'for' của riêng bạn. :) – MrGomez

+0

Thực ra, không, tôi rất sai. Tôi đang cập nhật câu trả lời của mình, bởi vì tôi đã tìm thấy một tài nguyên dứt khoát hơn. – MrGomez

13

Nếu bạn đang sử dụng Flask-SqlAlchemy, hãy xem phương thức paginatequery. paginate cung cấp một số phương pháp để đơn giản hóa việc phân trang.

record_query = Record.query.paginate(page, per_page, False) 
total = record_query.total 
record_items = record_query.items 

trang đầu tiên nên là 1 nếu không .total lợi nhuận ngoại lệ chia cho zero

+0

Bỏ qua các nhận xét khác của tôi, điều này hoạt động xuất sắc như hiện nay, tôi chỉ đang thực hiện 'dict (** request.args)' ngu ngốc trong một khu vực không liên quan và nhận được kết quả không mong muốn. – robru

+0

Không có điều này vẫn có thể là một ý tưởng tồi như nếu bạn kiểm tra nguồn họ đang sử dụng giới hạn và bù đắp. Bây giờ nếu giá trị offset quá lớn thì cơ sở dữ liệu sẽ đi qua tất cả các giá trị đó gây ra vấn đề về hiệu năng. –

0

Nếu bạn không sử dụng Flask, bạn có thể sử dụng chức năng SQLAlchemy 'lát cắt' hoặc một combo của 'giới hạn' & 'bù đắp ', như đã đề cập here. Ví dụ:

some_query = Query([TableBlaa]) 
query = some_query.limit(number_of_rows_per_page).offset(page_number*number_of_rows_per_page) 
# -- OR -- 
query = some_query.slice(page_number*number_of_rows_per_page, (page_number*number_of_rows_per_page)+number_of_rows_per_page) 
current_pages_rows = session.execute(query).fetchall() 
+0

Giới hạn bù đắp là xấu nếu bù đắp cao vì nó đã đi qua tất cả các hàng trước đó để tìm nạp các hàng bị bù trừ do đó gây ra sự cố hiệu suất –