如何在SQLAlchemy中加入两个查询?

时间:2016-04-04 01:23:37

标签: python mysql sqlalchemy

在此示例中,我使用的是示例MySQL classicmodels database

所以我有两个问题:

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表中的列。

编辑:

由于@ univerio的答案,我找到了我的解决方案。我的真正目标是对两个现有查询进行联接,然后对它们执行SUMCOUNT操作。

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

1 个答案:

答案 0 :(得分:4)

您可以使用with_entities()覆盖实体列表:

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