Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Ordre SQLAlchemy par résultat de fonction

Attributs hybrides sont des méthodes spéciales qui agissent à la fois comme une propriété Python et une expression SQL. Tant que votre difficulty La fonction peut être exprimée en SQL, elle peut être utilisée pour filtrer et trier comme une colonne normale.

Par exemple, si vous calculez la difficulté comme le nombre de perroquets qu'un problème a, multiplié par dix si le problème date de plus de 30 jours, vous utiliserez :

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
        )

et interrogez-le avec :

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