2012-03-28 6 views
11

Ho bisogno di leggere i dati da tutte le righe di una tabella di grandi dimensioni, ma non voglio recuperare tutti i dati in memoria in una volta. Esiste una funzione SQLAlchemy che gestirà il paging? Cioè, tira diverse righe in memoria e poi recupera di più quando necessario.SQLAlchemy e paging

Capisco che puoi farlo con limit e offset come this article suggerisce, ma preferirei non gestirlo se non dovessi.

risposta

13

Vedere this answer. In breve, puoi utilizzare l'operatore yield_per.

+0

Sembra che supporta l'impaginazione nel contesto di rendere un sito web ... Sto solo cercando di parlare con un database, nessun frontend. –

+0

Al livello del database, l'iterazione 'limite' e' offset' è in realtà lo scenario più appropriato, esattamente come originariamente documentato. Credo che la logica qui sia quella che sta succedendo con il database _qualunque, quindi potresti anche fornire il tuo ciclo 'for'. :) – MrGomez

+0

In realtà, no, mi sbaglio molto. Sto aggiornando la mia risposta, perché ho trovato una risorsa più definitiva. – MrGomez

13

Se si utilizza Flask-SqlAlchemy, vedere il metodo paginate di query. paginate offre diversi metodi per semplificare l'impaginazione.

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

Prima pagina dovrebbe essere 1 altrimenti l'eccezione .total rendimenti divisa per zero

+0

Ignora i miei altri commenti, questo funziona in modo eccellente così com'è, stavo facendo 'dict (** request.args)' stupidamente in un'area non correlata e ottenendo risultati inaspettati. – robru

+0

No, questa potrebbe essere ancora una cattiva idea, come se si controllasse l'origine che stanno utilizzando il limite e l'offset. Ora se il valore di offset è troppo grande, il database passerebbe attraverso tutti questi valori causando un problema di prestazioni. –

0

Se non si utilizza Flask, è possibile utilizzare la funzione SQLAlchemy 'fetta' o una combinazione di 'limite' & 'compensato ', come detto here. Es .:

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

L'offset di limite è errato se l'offset è elevato poiché ha attraversato tutte le righe precedenti per recuperare le righe sfalsate causando così un problema di prestazioni –