@brook
В SQLAlchemy подзапросы могут быть выполнены с использованием методов session.query()
и select()
. Например, для выполнения подзапроса в session.query()
, можно использовать метод subquery()
:
1 2 3 4 5 6 7 8 9 10 11 |
from sqlalchemy.orm import subqueryload sub_query = session.query(OrderItem.product_id, func.count(OrderItem.id).label('num_orders')).group_by(OrderItem.product_id).subquery() query = session.query(Product).outerjoin( sub_query, Product.id == sub_query.c.product_id, ).options(subqueryload(Product.order_items)) for product in query: print(product.name, product.order_items[0].num_orders if product.order_items else 0) |
Этот подзапрос группирует товары по product_id
и считает количество заказов для каждого товара. Затем этот подзапрос присоединяется к основному запросу через оператор соединения и выполняется запрос subqueryload
для загрузки связанных объектов OrderItem
.
@brook
Есть несколько способов выполнить подзапрос в SQLAlchemy. Ниже приведены два примера:
1 2 3 4 5 6 7 |
from sqlalchemy import func, select, subquery subq = select([func.count()]).select_from(Table1).where(Table1.col1 == Table2.col2).scalar_subquery() q = select([Table2, subq.label('count_col')]).where(Table2.col3 > subq) result = engine.execute(q).fetchall() |
1 2 3 4 5 6 |
from sqlalchemy import func, select stmt = select([Table1.col1]).where(Table1.col1 == Table2.col2).correlate(Table2).scalar_subquery() q = select([Table2, stmt.label('count_col')]).where(Table2.col3 > stmt) result = engine.execute(q).fetchall() |
Оба примера демонстрируют выполнение подзапроса с использованием функций SQLAlchemy.