Sử dụng as_scalar()
hoặc 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)
Sử dụng as_scalar()
giới hạn các cột và hàng được trả về là 1, vì vậy bạn không thể lấy toàn bộ đối tượng mô hình bằng cách sử dụng nó (dưới dạng query(PropertyValuation)
là một lựa chọn của tất cả các thuộc tính của PropertyValuation
), nhưng chỉ nhận được định giá thuộc tính hoạt động.
Không cần phải vượt qua nó sau này. Cách khai báo truy vấn con hiện tại của bạn vẫn ổn vì SQLAlchemy có thể tự động tương quan TỪ các đối tượng với các đối tượng của một truy vấn kèm theo . Tôi đã thử tạo các mô hình thể hiện phần nào những gì bạn có và đây là cách hoạt động của truy vấn ở trên (có thêm ngắt dòng và thụt lề để dễ đọc):
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