2012-05-20 11 views
8

Jeśli mam kwerendy SQLAlchemy ORM:SQLAlchemy ORM: modyfikowanie kolumn zwracanych przez zapytania

admin_users = Session.query(User).filter_by(is_admin=True) 

jest to możliwe do modyfikowania kolumn zwracanych przez tego zapytania?

Na przykład tak, że mogę wybrać tylko kolumny User.id, i użyć jej w sub zapytania:

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

Uwaga: metoda .values() nie będzie działać, ponieważ wykonuje zapytanie i zwraca iterable wyników (tak, ex, EmailAddress.user_id.in_(admin_users.values(User.id)) wykona dwa zapytania, a nie jeden).

Wiem, że mógłbym zmodyfikować pierwsze zapytanie na Session.query(User.id), ale zastanawiam się, w jaki sposób mogę zmodyfikować kolumny zwrócone przez zapytanie.

Odpowiedz

16

Czuję twój ból na rzeczy values(). W 0.6.5 dodałem with_entities() który podobnie jak values() wyjątkiem nie iteracyjne:

q = q.with_entities(User.id) 
1

Zakładając, że Address.user_id definiuje ForeignKey, zapytanie poniżej zrobi pracy bardziej wydajnie w porównaniu do IN operatora:

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

Jeśli nie masz ForeignKey (chociaż powinien), można określić join stan jawnie:

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

Ale jeśli naprawdę chce to zrobić z in_ operatora, tutaj idziesz (uwaga subquery):

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

To prawda, że ​​w przykładzie I, pod warunkiem, od 'JOIN' jest poprawne rozwiązanie. Ponieważ jednak nie odnosi się do zadawanego mi pytania, zamierzam przyjąć odpowiedź Zzżeka. –

+0

@DavidWolever: Wystarczająco fair – van

Powiązane problemy