Gebruik as_scalar()
, of 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)
Met behulp van as_scalar()
beperkt geretourneerde kolommen en rijen tot 1, dus u kunt niet het hele modelobject gebruiken (als query(PropertyValuation)
is een selectie van alle attributen van PropertyValuation
), maar krijgt alleen de waardering attribuut werkt.
Het is niet nodig om het later door te geven. Uw huidige manier om de subquery te declareren is prima zoals het is, aangezien SQLAlchemy automatisch correleren FROM-objecten met die van een omsluitende query . Ik heb geprobeerd modellen te maken die enigszins weergeven wat je hebt, en zo werkt de bovenstaande query (met toegevoegde regeleinden en inspringing voor de leesbaarheid):
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