2016-04-04 9 views
2

Bu örnekte, örnek MySQL classicmodels database kullanıyorum.SQLAlchemy'de iki sorguya nasıl katılır?

Yani iki sorgu var:

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

en Bundan sonra veritabanına bir daha sorgular yapamaz ve sadece bu noktadan itibaren bu iki sorgu katılabilir varsayalım.

ben bir dış yapmak istiyorum böyle bir şey yapmak mümkün onlara katılmak: Bu konuda bir outerjoin yapmak her

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

Ancak, sadece sol katılmak için görünebilir. Böyle

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

Ve yapıyor şey:

for orderdetails, product in query: 
    print orderdetails, product 

bana bir hata verir: TypeError: 'OrderDetails' object is not iterable böyle

query = orderdetails.outerjoin(Products) 

Kod sütunları ORDERDETAILS sadece verir.

Neyi yanlış yapıyorum? Sadece ürünler tablosundan sütunlar istiyorum.

DÜZENLEME:

Ben @ univerio cevabı benim çözüm sayesinde bulduk. Asıl amacım, mevcut iki sorgunun birleşimini yapmak ve daha sonra bunlara bir SUM ve COUNT işlemi yapmaktı.

SQLAlchemy temel olarak bir sorgu nesnesini SQL deyimine dönüştürür. with_entities işlevi, SELECT ifadesini, ona aktardığınız her şeye değiştirir. Bu açma ve okuma içerir benim güncellenmiş bir çözümdür katılmak:

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 

cevap

3

Sen with_entities() ile varlık listesi üzerine yazabilirsiniz:

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

Evet, session.query aracılığıyla bunu yapmak için bir yol var biliyorum ama sahip olduğum iki oturum sorgusuyla bunu yapmanın bir yolu var mı? – joshualan

+1

@joshualan Bunu neden yapmanız gerektiğini anladığımdan emin değilim. Sorgu boyunca yinelenene kadar hiçbir SQL yürütmez. Ya da iki alt soruyu birleştirmek mi istediniz? Ya da var olan bir sorguyu yeniden kullanmak istersiniz, çünkü üzerinde filtreler var mı? – univerio

+0

Evet, sadece mevcut sorguları yeniden kullanmak istedim. Bir yolu var gibi görünmüyor. – joshualan