Použijte as_scalar()
nebo 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)
Pomocí as_scalar()
omezuje vrácené sloupce a řádky na 1, takže pomocí něj nemůžete získat celý objekt modelu (jako query(PropertyValuation)
je výběr ze všech atributů PropertyValuation
), ale získáte pouze hodnocení atribut funguje.
Není třeba to předávat později. Váš současný způsob deklarování poddotazu je v pořádku, protože SQLAlchemy může automaticky korelují objekty FROM s objekty vloženého dotazu . Pokusil jsem se vytvořit modely, které trochu reprezentují to, co máte, a takto funguje výše uvedený dotaz (s přidanými zalomeními řádků a odsazením pro čitelnost):
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