Използвайте as_scalar()
, или label()
:
subquery = (
session.query(PropertyValuation.valuation)
.filter(PropertyValuation.zip_code == Property.address_zip)
.order_by(func.abs(func.datediff(PropertyValuation.as_of, Sale.date_sold)))
.limit(1)
)
query = session.query(Sale.agent_id,
Sale.property_id,
Property.address_zip,
# `subquery.as_scalar()` or
subquery.label('back_valuation'))\
.join(Property)
Използване на as_scalar()
ограничава върнатите колони и редове до 1, така че не можете да получите целия обект на модела, като го използвате (като query(PropertyValuation)
е избран от всички атрибути на PropertyValuation
), но получаване само на оценката атрибутът работи.
Няма нужда да го предавате по-късно. Вашият текущ начин за деклариране на подзаявката е добър, тъй като SQLAlchemy може автоматично съпоставя FROM обекти с тези на обграждаща заявка . Опитах се да създам модели, които донякъде представят това, което имате, и ето как работи заявката по-горе (с добавени прекъсвания на редове и отстъп за четливост):
In [10]: print(query)
SELECT sale.agent_id AS sale_agent_id,
sale.property_id AS sale_property_id,
property.address_zip AS property_address_zip,
(SELECT property_valuations.valuation
FROM property_valuations
WHERE property_valuations.zip_code = property.address_zip
ORDER BY abs(datediff(property_valuations.as_of, sale.date_sold))
LIMIT ? OFFSET ?) AS back_valuation
FROM sale
JOIN property ON property.id = sale.property_id