2016-05-30 10 views
1

Ich habe eine Datenbank und versuche Informationen mit der Funktion MID() abzufragen. Im normalen SQL würde ich MID verwenden wie (von W3 Beispiel Website) ..Python SQLALCHEMY Abfrage mit MID()

SELECT MID(City,1,4) AS ShortCity 
FROM Customers; 

Konvertieren dieser zu sqlalchemy ein bisschen eine Herausforderung gewesen. Ich bin in der Lage, die Abfrage mit Paginierung durchzuführen, aber nicht Mitte verwenden. Bisher habe ich Original-Abfrage, die funktioniert ..

links = Item.query.filter(Item.title.like('%' +search_term +'%')).paginate(page, 10, True) 

Converting es Arbeit tut ..

links = Item.query.filter(func.mid(Item.title.like, 1, 3)('%' +search_term + '%')).paginate(page, 10, True) 



    TypeError: 'Function' object is not callable 

Ich möchte nur xy Menge von Zeichen aus dem Titel (String-Spalte)

+0

Ich kann sehen, dass Sie ein Komma ',' fehlt, dh 'func.mid (Item.title.like, 1, 3) ('%' + search_term + '%')' sollte 'func sein .mid (Item.title.like, 1, 3), ('%' + search_term + '%') '. Sehen Sie, wenn das das Problem löst, können andere Dinge mit diesem Code nicht stimmen, aber typeerror wird gefunden, weil das von func.mid (...) zurückgegebene Objekt nicht aufrufbar ist und '('%' + search_term + '%') 'wird dann als Funktionsargument behandelt –

+0

gibt diff error .. – Anekdotin

+0

OperationalError: (sqlite3.OperationalError) in der Nähe von"% ": Syntaxfehler [SQL: u'SELECT items.id AS items_id, items.title AS items_title, items.link AS items_link, items.description AS items_description, items.member_since AS items_member_since, items.last_updated AS items_last_aktualisiert, items.click_count AS items_click_count \ nFROM-Einträge \ nWHIER mid (?,?,?) UND% tor% \ n LIMIT? OFFSET? '] [Parameter: (>, 1, 3, 10, 0)] – Anekdotin

Antwort

1

Ich kann sehen, dass Sie ein Komma , zwischen den Klammern in

func.mid(Item.title.like, 1, 3)('%' +search_term + '%') 
fehlt

was den zweiten Ausdruck in Klammern zu einem Argument für den ersten macht. Das ist die Quelle der Ausnahme

TypeError: 'Function' object is not callable. 

Aber ein LIKE Operator zu erzeugen, versuchen:

func.mid(Item.title, 1, 3).like('%' +search_term + '%') 

Dies gibt Ihnen WHERE-Klausel, die Ihr Python-Code scheint darauf hinzudeuten. In Ihrem Code ist die like falsch platziert.

Wenn Sie jedoch die folgende SQL generieren wollen:

SELECT MID(City,1,4) AS ShortCity 
FROM Customers; 

Der entsprechende sqlalchemy Code

session.query(func.mid(Customer.city, 1, 4).label('ShortCity')) 

vorausgesetzt das Modell Customer und hat wäre ein Feld city Namen genannt wird.

+0

in einem Noob kopiert und eingefügt wurde, aber warum session.query über Item.query? Habe ich mein Projekt falsch eingerichtet? – Anekdotin

+0

Nein, sie sind beide gültig, ich habe nur _happened_ meine Abfrage mit einer Sitzung explizit schreiben. Hinter den Kulissen erstellt sqlalchemy immer noch eine Sitzung. –

+0

Kann es nicht zur Arbeit .. :( – Anekdotin