sql >> Base de Datos >  >> RDS >> Sqlserver

Orden de SQLAlchemy por resultado de función

Atributos híbridos son métodos especiales que actúan como una propiedad de Python y una expresión SQL. Mientras tu difficulty La función se puede expresar en SQL, se puede usar para filtrar y ordenar como una columna normal.

Por ejemplo, si calcula la dificultad como el número de loros que tiene un problema, multiplicado por diez si el problema tiene más de 30 días, usaría:

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
        )

y consultarlo con:

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