2012-03-28 20 views
11

Necesito leer datos de todas las filas de una tabla grande, pero no quiero extraer todos los datos en la memoria a la vez. ¿Hay una función SQLAlchemy que manejará la paginación? Es decir, inserte varias filas en la memoria y luego busque más cuando sea necesario.SQLAlchemy y paginación

Entiendo que puede hacer esto con limit y offset como this article sugiere, pero prefiero no manejarlo si no es necesario.

Respuesta

13

Ver this answer. En resumen, puede usar el operador yield_per.

+0

Parece que admite la paginación en el contexto de la creación de un sitio web ... Estoy tratando de hablar con una base de datos, sin frontend. –

+0

En la capa de la base de datos, la iteración 'limit' y' offset' es en realidad el escenario más apropiado, exactamente como se documentó originalmente. Creo que el razonamiento aquí es que eso es lo que está sucediendo con la base de datos _de todos modos_, por lo tanto, también puede proporcionar su propio bucle 'for'. :) – MrGomez

+0

En realidad, no, estoy muy equivocado. Estoy actualizando mi respuesta, porque encontré un recurso más definitivo. – MrGomez

13

Si está utilizando Flask-SqlAlchemy, consulte el método paginate de query. paginate ofrece varios métodos para simplificar la paginación.

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

Primera página debe ser 1 en caso contrario la excepción .total vuelve dividido por cero

+0

Haga caso omiso de mis otros comentarios, esto funciona de manera excelente como es, solo estaba haciendo 'dict (** request.args)' estúpidamente en un área no relacionada y obteniendo resultados inesperados. – robru

+0

No, esto aún podría ser una mala idea, como si comprueba la fuente en la que están utilizando límite y desplazamiento. Ahora, si el valor de compensación es demasiado grande, la base de datos atravesaría todos esos valores, lo que ocasionaría un problema de rendimiento. –

0

Si no está utilizando el frasco, puede utilizar la función sqlalchemy 'rebanada' o una combinación de 'límite' & 'compensado ', como se menciona here. Por ejemplo:

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

El desplazamiento del límite es malo si el desplazamiento es alto ya que ha recorrido todas las filas anteriores para recuperar las filas compensadas lo que causa un problema de rendimiento –