2016-04-04 7 views
2

この例では、サンプルMySQL classicmodels databaseを使用しています。SQLAlchemyで2つのクエリを結合するには?

は、だから私は2つのクエリを持っている:

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

のは、私はこの後にデータベースへのより多くのクエリを作ることができないと私はこの時点から、これらの2つのクエリを結合することができますと仮定しましょう。

私は外をしたいが、このような何かをできるようにするためにそれらに参加:私はこれにアウター・ジョインを行うたび

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

は、しかし、私は唯一の左の参加得るように見えることができます。

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

そして、このような何かやって:

for orderdetails, product in query: 
    print orderdetails, product 

は私にエラーを与える:TypeError: 'OrderDetails' object is not iterableをこのような

query = orderdetails.outerjoin(Products) 

コード列のみをORDERDETAILS生み出します。

私は間違っていますか?私は、Productsテーブルの列も欲しいだけです。

EDIT:

私は@のuniverioの答えに私の解決策のおかげで発見しました。私の実際の目標は、既存の2つのクエリを結合してから、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 

答えて

3

あなたはwith_entities()でエンティティのリストを上書きすることができます。

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

ええ、私はsession.queryを通してそれを行う方法があります知っています私は持っている2つのセッションのクエリでそれを行う方法はありますか? – joshualan

+1

@joshualan私はあなたがなぜそれをする必要があるのか​​分かりません。クエリを反復処理するまでSQLは実行されません。または、2つのサブクエリを結合しますか?あるいは、既存のクエリがすでにフィルタされているため、既存のクエリを再利用したいのですか? – univerio

+0

ええ、私はただそれらの既存のクエリを再利用したかったのです。しかし、方法があるように見えません。 – joshualan

関連する問題