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 ऑब्जेक्ट्स से स्वचालित रूप से एक संलग्न क्वेरी से संबंधित हैं . मैंने ऐसे मॉडल बनाने की कोशिश की जो कुछ हद तक आपके पास का प्रतिनिधित्व करते हैं, और यहां बताया गया है कि ऊपर की क्वेरी कैसे काम करती है (अतिरिक्त लाइन-ब्रेक और पठनीयता के लिए इंडेंटेशन के साथ):
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