Как преобразовать SQL-скалярный подзапрос в выражение SQLAlchemy

Мне нужна помощь litle с выражением в языке SQLAlchemy моего кода следующим образом:

SELECT s.agent_id, s.property_id, p.address_zip, ( SELECT v.valuation FROM property_valuations v WHERE v.zip_code = p.address_zip ORDER BY ABS(DATEDIFF(v.as_of, s.date_sold)) LIMIT 1 ) AS back_valuation, FROM sales s JOIN properties p ON s.property_id = p.id 

Внутренний подзапрос, предназначенный для получения значения свойства из таблицы propert_valuations с столбцами ( zip_code INT, valuation DECIMAL, as_if DATE ), ближе всего к дате продажи от продажи таблицы. Я знаю, как переписать его, но я полностью придерживался выражения order_by – я не могу подготовить подзапрос, чтобы позже передать члену заказа.

В настоящее время у меня есть следующие запросы:

 subquery = ( session.query(PropertyValuation) .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).join(Sale.property_) 

Как объединить эти запросы вместе?

Как объединить эти запросы вместе?

Используйте 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() ограничивает возвращаемые столбцы и строки as_scalar() 1, поэтому вы не можете использовать весь объект модели, используя его (поскольку query(PropertyValuation) – это выбор всех атрибутов PropertyValuation ), но работает только атрибут оценки .

но я полностью застрял в выражении order_by – я не могу подготовить подзапрос, чтобы позже передать члену заказа.

Не нужно передавать его позже. Ваш текущий способ объявления подзапроса в порядке, так как SQLAlchemy может автоматически коррелировать FROM объектов с объектами входящего запроса . Я пробовал создавать модели, которые в некоторой степени представляют собой то, что у вас есть, и вот как работает вышеописанный запрос (с добавлением разрывов строк и отступом для удобочитаемости):

 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