Använd 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)
Använder as_scalar()
begränsar returnerade kolumner och rader till 1, så du kan inte få hela modellobjektet med det (som query(PropertyValuation)
är ett urval av alla attribut för PropertyValuation
), men får bara värderingen attribut fungerar.
Det finns ingen anledning att passera det senare. Ditt nuvarande sätt att deklarera underfrågan är bra som det är, eftersom SQLAlchemy kan korrelera automatiskt FROM-objekt till de för en omslutande fråga . Jag försökte skapa modeller som i viss mån representerar vad du har, och så här fungerar frågan ovan (med tillagda radbrytningar och indrag för läsbarhet):
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