В этом примере я использую образец 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
Да, я знаю, что есть способ сделать это через session.query но есть ли способ сделать это с двумя сессионными запросами, которые у меня есть? – joshualan
@joshualan Я не уверен, что понимаю, зачем вам это нужно. SQL не выполняется, пока вы не выполните итерацию по запросу. Или вы хотите присоединиться к двум подзапросам? Или вы хотите повторно использовать существующий запрос, потому что у вас уже есть фильтры? – univerio
Да, я просто хотел повторно использовать те существующие запросы. Похоже, что есть способ. – joshualan