2016-05-30 9 views
0

ich sqlalchemy bin mit einer Liste von Objektenleer Paginieren Objekt sqlalchemy

results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False) 

Manchmal list_of_ids kann leer sein, mit der Funktion Paginieren abzurufen. Ich habe festgestellt, dass Abfragen, bei denen diese Liste leer ist, sehr langsam sind. Es gibt auch eine Warnung, dass die Abfrage von leeren Listen langsam sein kann. Um jedoch meine Funktionalität einfach zu halten, brauche ich ein leeres paginate-Objekt. Gibt es eine Möglichkeit, das zu erreichen, ohne eine Abfrage auszuführen?

Antwort

1

Sie könnten wahrscheinlich herumspielen und instanziiert Ihre eigene Instanz einer leeren Pagination Objekt, um eine Abfrage zu vermeiden, aber es könnte einfacher sein, eine einfache, schnelle Abfrage auszuführen, die keine Zeilen zurückgibt:

>>> empty_paginator = models.Object.query.filter_by(id=None).paginate() 
>>> empty_paginator.items 
[] 
>>> empty_paginator.has_next 
False 

Die Abfrage sollte sehr schnell sein, da sie sich auf dem Primärschlüssel der Tabelle befindet und daher einen Index verwendet. Stellen Sie nur sicher, dass Sie etwas auswählen, das nicht existiert, z. eine ID von None. Dann verwenden Sie es wie folgt aus:

if list_of_ids: 
    results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False) 
else: 
    results = models.Object.query.filter_by(id=-1).paginate() 

andere Möglichkeit, ein Pagination Objekt zu Unterklasse wäre, die Methoden überschreiben, die ein gültiges Abfrageobjekt benötigen, um eine Abfrage zu verhindern, dass:

class EmptyPaginator(flask.ext.sqlalchemy.Pagination): 
    def __init__(self): 
     super(EmptyPaginator, self).__init__(None, 1, 1, 0, []) 

    def next(self, error_out=False): 
     self.page += 1 
     return self 

    def prev(self, error_out=False): 
     self.page -= 1 
     return self 

Verwenden Sie es wie Dieser:

if list_of_ids: 
    results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False) 
else: 
    results = EmptyPaginator() 

oder diese (prägnanter aber weniger lesbar):

results = models.Object.query.filter(models.Object.id.in_(list_of_ids)).paginate(page, 10, False) if list_of_ids else EmptyPaginator()