2017-06-09 1 views
2

Ich versuche, basierend auf Informationen, die in einen RESTful-Webdienst übergeben werden, SQLalchemy zu verwenden, um eine Abfrage zu erstellen, die optional Filtern und Sortieren verwenden kann. Ich konnte dies iterativ in Java tun, indem ich mit einer einfachen Abfrage anfing und bei Bedarf Filter/Sortierung hinzufügte, aber ich kann es in Python nicht herausfinden. Gibt es eine Möglichkeit etwas ähnliches wie dies zu tun:Python & SqlAlchemy - Iterativer Aufbau einer Abfrage

q = BaseQuery([Image], session) 

# Add pagination 
q.paginate(page=page, per_page=per_page) 

# If present, add filter 
if filter is not None: 
    q.filter(or_(func.lower(Image.description).like('%' + filter + '%'), func.lower(Image.name).like('%' + filter + '%'))) 

# If present, add sorting 
if sortField is not None and sortDir is not None: 
    if sortDir == 'asc': 
     q.sort_by(asc(Image.sortField)) 
    elif sortDir == 'desc': 
     q.sort_by(desc(Image.sortField)) 

for item in q.items: 
    print(item) 

diese Weise wird die Abfrage q gebaut wird iterativ auf das, was die Benutzeroberfläche erfordert, statt mit einer Tonne zu tun, wenn Aussagen der Abfrage Fall ist es zu bestimmen, erfordert. Es scheint einfach nicht zu funktionieren.

+1

Gibt es Gründe, die Sie nicht erneut die Zuordnung zu 'q' jedes Mal? 'q = q.paginate (...)', 'q = q.sorted_by (...)'? –

+0

Ah, ist das wirklich so einfach? Sie müssen es einfach neu zuweisen, anstatt zu versuchen, ein bestehendes Objekt hinzuzufügen. – ev0lution37

+1

Wo die Operationskette, dann ja: 'something.filter (...). Sort_by (...)' ist nicht anders als: 'q = etwas.filter (...)' dann 'q = q.sort_by (...) ' –

Antwort

0

Per Jon Kommentar oben, das war viel einfacher als erwartet. Ich habe einfach neu zuweisen benötigt (q = q.filter() zum Beispiel) die Variable:

q = BaseQuery([Image], session) 

# If present, add filter 
if filter is not None: 
    q = q.filter(or_(func.lower(Image.description).like('%' + filter + '%'), func.lower(Image.name).like('%' + filter + '%'))) 

# If present, add sorting 
if sortField is not None and sortDir is not None: 
    if sortDir == 'asc': 
     q = q.order_by(asc(getattr(Image, sortField))) 
    elif sortDir == 'desc': 
     q = q.order_by(desc(getattr(Image, sortField))) 

# Add pagination 
q = q.paginate(page=page, per_page=per_page) 

for item in q.items: 
    print(item) 
+0

Sieht so aus, als ob 'sortField' eine Zeichenkette ist, weil Sie auf ein bestimmtes Feld zugreifen wollen, dann wollen Sie' getattr (Image, sortField) 'dort anstelle von' Image.sortField' (was auf das 'sortField' Attribut zugreifen wird - kein spezifischer Spaltenname) –

+0

Ja, guter Fang. Machte nur Pseudo-Code, aber könnte es genauso gut beheben. Vielen Dank! – ev0lution37

+0

Es gibt ein Problem damit, dass es barf ist, wenn Ihr iterativer Filter Builder einen Join redundant ausführt. In einigen meiner Apps habe ich einen Helfer hinzugefügt, um zu verfolgen, welche Tabellen für diesen Zweck verwendet wurden, und es funktionierte wie ein Zauber –