2016-04-04 2 views
2

В этом примере я использую образец MySQL classicmodels database.Как присоединиться к двум запросам в SQLAlchemy?

Поэтому у меня есть два запроса:

products = session.query(Products) 
orderdetails = session.query(OrderDetails) 

Давайте предположим, что я не могу сделать больше запросов к базе данных после этого, и я могу только присоединиться к этим двум запросы с этого момента.

Я хочу сделать внешнее соединение на них, чтобы быть в состоянии сделать что-то вроде этого:

for orderdetail, product in query: 
    print product.productName, product.productCode, orderdetails.quantityOrdered 

Однако всякий раз, когда я делаю внешнее соединение на это, я могу только показаться, чтобы получить левое соединение.

query = orderdetails.outerjoin(Products) 

код, как это дает только ORDERDETAILS столбцы:

for q in query: 
    # Only gives orderdetails columns 
    print q 

И делать что-то вроде этого:

for orderdetails, product in query: 
    print orderdetails, product 

дает мне ошибку: TypeError: 'OrderDetails' object is not iterable.

Что я делаю неправильно? Мне просто нужны столбцы из таблицы Products.

EDIT:

Я нашел мое решение благодаря ответу @ univerio в. Моя реальная цель состояла в том, чтобы выполнить соединение по двум существующим запросам, а затем выполнить операцию и COUNT.

SQLAlchemy в основном просто преобразует объект запроса в инструкцию SQL. Функция with_entities просто изменяет выражение SELECT на все, что вы ему передаете. Это мое обновленное решение, которое включает в себя распаковку и чтения присоединиться:

for productCode, numOrders, quantityOrdered in orderdetails.with_entities(
     OrderDetails.productCode, 
     func.count(OrderDetails.productCode), 
     func.sum(OrderDetails.quantityOrdered)).group_by(OrderDetails.productCode): 
    print productCode, numOrders, quantityOrdered 

ответ

3

Вы можете переписать список сущностей с with_entities():

orderdetails.outerjoin(Products).with_entities(OrderDetails, Products) 
+0

Да, я знаю, что есть способ сделать это через session.query но есть ли способ сделать это с двумя сессионными запросами, которые у меня есть? – joshualan

+1

@joshualan Я не уверен, что понимаю, зачем вам это нужно. SQL не выполняется, пока вы не выполните итерацию по запросу. Или вы хотите присоединиться к двум подзапросам? Или вы хотите повторно использовать существующий запрос, потому что у вас уже есть фильтры? – univerio

+0

Да, я просто хотел повторно использовать те существующие запросы. Похоже, что есть способ. – joshualan

Смежные вопросы