SQLAlchemy: hybrid_property expression and subquery

I am trying to make complex hybrid_property using SQLAlchemy: my model

class Consultation(Table):
    patient_id = Column(Integer)
    patient = relationship('Patient', backref=backref('consultations', lazy='dynamic'))

class Exam(Table):
    consultation_id = Column(Integer)
    consultation = relationship('Consultation', backref=backref('exams', lazy='dynamic'))

class VitalSign(Table):
    exam_id = Column(Integer)
    exam = relationship('Exam', backref=backref('vital', lazy='dynamic'))
    vital_type = Column(String)
    value = Column(String)

class Patient(Table):
    patient_data = Column(String)

    @hybrid_property
    def last_consultation_validity(self):
        last_consultation = self.consultations.order_by(Consultation.created_at.desc()).first()
        if last_consultation:
            last_consultation_conclusions = last_consultation.exams.filter_by(exam_type='conclusions').first()
            if last_consultation_conclusions:
                last_consultation_validity = last_consultation_conclusions.vital_signs.filter_by(sign_type='validity_date').first()
                if last_consultation_validity:
                    return last_consultation_validity

        return None

    @last_consultation_validity.expression
    def last_consultation_validity(cls):
        subquery = select([Consultation.id.label('last_consultation_id')]).\
            where(Consultation.patient_id == cls.id).\
            order_by(Consultation.created_at.desc()).limit(1)
        j = join(VitalSign, Exam).join(Consultation)
        return select([VitalSign.value]).select_from(j).select_from(subquery).\
            where(and_(Consultation.id == subquery.c.last_consultation_id, VitalSign.sign_type == 'validity_date'))

As you can see, my model is quite complicated. Patients receive counseling. Exams and VitalSigns are cascading data for Consultations. The idea is that all consultations have no legal force, but these new consultations make the previous consultations really uninteresting: I only need the validity from the last consultation; if the patient is valid in previous consultations, I am not interested.

What I would like to do is be able to order using the hybrid_property last_consultation_validity property.

SQL output looks fine:

SELECT vital_sign.value 
FROM (SELECT consultation.id AS last_consultation_id 
FROM consultation, patient 
WHERE consultation.patient_id = patient.id ORDER BY consultation.created_at DESC
LIMIT ? OFFSET ?), vital_sign JOIN exam ON exam.id = vital_sign.exam_id JOIN consultation ON consultation.id = exam.consultation_id 
WHERE consultation.id = last_consultation_id AND vital_sign.sign_type = ?

last_consultation_validity, ... hybrid_property, ( patient.id), . , SQL , patient FROM SELECT.

, , ​​SQLAlchemy - ... .

+4

Source: https://habr.com/ru/post/1627183/


All Articles