Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQLAlchemy-Reihenfolge nach Funktionsergebnis

Hybridattribute sind spezielle Methoden, die sowohl als Python-Eigenschaft als auch als SQL-Ausdruck fungieren. Solange Ihre difficulty Funktion kann in SQL ausgedrückt werden, sie kann zum Filtern und Sortieren wie eine normale Spalte verwendet werden.

Wenn Sie beispielsweise die Schwierigkeit als Anzahl der Papageien eines Problems berechnen, multipliziert mit zehn, wenn das Problem älter als 30 Tage ist, würden Sie Folgendes verwenden:

from datetime import datetime, timedelta
from sqlalchemy import Column, Integer, DateTime, case
from sqlalchemy.ext.hybrid import hybrid_property

class Problem(Base):
    parrots = Column(Integer, nullable=False, default=1)
    created = Column(DateTime, nullable=False, default=datetime.utcnow)

    @hybrid_property
    def difficulty(self):
        # this getter is used when accessing the property of an instance
        if self.created <= (datetime.utcnow() - timedelta(30)):
            return self.parrots * 10

        return self.parrots

    @difficulty.expression
    def difficulty(cls):
        # this expression is used when querying the model
        return case(
            [(cls.created <= (datetime.utcnow() - timedelta(30)), cls.parrots * 10)],
            else_=cls.parrots
        )

und fragen Sie es ab mit:

session.query(Problem).order_by(Problem.difficulty.desc())