2012-05-20 9 views
8

dönen sütunları değiştirmek? ÖrneğinSQLAlchemy ORM:</p> <pre><code>admin_users = Session.query(User).filter_by(is_admin=True) </code></pre> <p>mümkün mü o sorgu tarafından döndürülen sütun değiştirme: Bir SQLAlchemy ORM sorgusu var ise bir sorgudan

, sadece User.id sütunu seçin ve alt sorguda kullanan böylece: bu sorguyu yürütür ve bir iterable döner olarak, .values() yöntem çalışmaz:

admin_email_addresses = Session.query(EmailAddress)\ 
    .filter(EmailAddress.user_id.in_(admin_users.select_columns(User.id)) 

Not sonuçların (yani, ex, EmailAddress.user_id.in_(admin_users.values(User.id)) iki sorgu gerçekleştirir, bir değil).

Session.query(User.id) olmak üzere ilk sorguyu değiştirebileceğimi biliyorum, ancak özellikle bir sorgu tarafından döndürülen sütunları nasıl değiştirebileceğimi merak ediyorum. Eğer bir ForeignKey yoksa

admin_email_addresses = session.query(EmailAddress).\ 
    join(User).filter(User.is_admin==True) 

(her ne kadar yapmanız gerekir), belirtebilirsiniz:

cevap

16

Acılarınızı values() şeyinde hissediyorum. 0.6.5 ben sadece yineleme vermez hariç values() gibidir with_entities() ekledi:

q = q.with_entities(User.id) 
1

sizin Address.user_id bir ForeignKey tanımlar varsayarsak, sorgu altına IN operatöre kıyasla daha verimli iş yapacak explicitely join durumu:

admin_email_addresses = session.query(EmailAddress).\ 
    join(User, User.id==EmailAddress.user_id).filter(User.is_admin==True) 

Ama gerçekten burada, in_ operatör ile yapmak istiyorum eğer (subquery unutmayın) gidin:

subq = session.query(User.id).filter(User.is_admin==True).subquery() 
admin_email_addresses = session.query(EmailAddress).\ 
     filter(EmailAddress.user_id.in_(subq)) 
+0

Ben sağlanan örnekte, bir 'JOIN' doğru çözümdür, bu doğru. Ancak, aslında sorduğum soruyu ele almadığından, zzzeek'in cevabını kabul edeceğim. –

+0

@DavidWolever: yeterince adil – van

İlgili konular