Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQLAlchemy ordine per risultato della funzione

Attributi ibridi sono metodi speciali che agiscono sia come proprietà Python che come espressione SQL. Finché la tua difficulty può essere espressa in SQL, può essere utilizzata per filtrare e ordinare come una normale colonna.

Ad esempio, se calcoli la difficoltà come il numero di pappagalli di un problema, moltiplicato per dieci se il problema è più vecchio di 30 giorni, dovresti usare:

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
        )

e interrogalo con:

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