Brug as_scalar()
, eller 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)
Brug af as_scalar()
begrænser returnerede kolonner og rækker til 1, så du ikke kan få hele modelobjektet ved at bruge det (som query(PropertyValuation)
er et udvalg af alle attributterne for PropertyValuation
), men får kun vurderingen attribut virker.
Der er ingen grund til at videregive det senere. Din nuværende måde at erklære underforespørgslen på er fin, som den er, da SQLAlchemy kan korrelerer automatisk FROM-objekter til dem i en omsluttende forespørgsel . Jeg prøvede at skabe modeller, der i nogen grad repræsenterer det, du har, og her er, hvordan forespørgslen ovenfor fungerer (med tilføjede linjeskift og indrykning for at kunne læse den):
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