2011-01-03 1 views
18

ich sqlalchemy bin mit mit einem Datetime-Feld einige Objekte zu speichern:Python SqlAlchemy order_by DateTime?

my_date = Field(DateTime()) 

würde Ich mag eine Abfrage auszuführen, die letzten paar Objekte (Entities mit dem my_date Feld, das die jüngsten sind) abrufen .

Ich habe folgendes versucht:

entities = MyEntity.query.order_by(MyEntity.time).limit(3).all() 
entities = MyEntity.query.order_by(-MyEntity.time).limit(3).all() 

Aber diese Anfragen die gleichen Objekte in der gleichen Reihenfolge zurück. Die SqlAlchemy-Dokumentation notiert die Verwendung des '-', um die Reihenfolge umzukehren, aber ich vermisse hier sicher etwas.

Kann jemand helfen?

Antwort

40

Sie können es wie folgt tun:

entities = MyEntity.query.order_by(desc(MyEntity.time)).limit(3).all() 

Möglicherweise müssen Sie:

from sqlalchemy import desc 

some documentation hier.

+0

Dieser Vorgang ist schmerzhaft langsam auf meiner Datenbank. Gibt es einen schnelleren Weg? – kalu

+0

@kalu: Verwenden Sie geeignete Indizes? Sehen Sie sich das generierte SQL an und profilieren Sie es. – thirtydot

1

Ich benutze sqlalchemy regelmäßig, so dass ich bestätigen kann, dass die Antwort von thirdyydot korrekt ist, müssen Sie sqlalchemy.sql.desc anstelle des - Operators verwenden, um die order_by zu beeinflussen.

4
entities = MyEntity.query.order_by(MyEntity.my_date.desc()).limit(3).all() 

sollte funktionieren.

+0

Ich bevorzuge das, weil es einen 'Import' vermeidet. – gwg