Gunakan as_scalar()
, atau 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)
Menggunakan as_scalar()
membatasi kolom dan baris yang dikembalikan menjadi 1, jadi Anda tidak dapat menggunakan seluruh objek model (sebagai query(PropertyValuation)
adalah pilihan dari semua atribut PropertyValuation
), tetapi hanya mendapatkan penilaian atribut berfungsi.
Tidak perlu melewatinya nanti. Cara Anda saat ini untuk mendeklarasikan subquery baik-baik saja, karena SQLAlchemy dapat secara otomatis mengkorelasikan objek FROM dengan objek kueri terlampir . Saya mencoba membuat model yang agak mewakili apa yang Anda miliki, dan inilah cara kueri di atas bekerja (dengan tambahan jeda baris dan lekukan agar mudah dibaca):
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