8

SQLAlchemy ORMクエリがある場合:

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

そのクエリによって返される列を変更することは可能ですか?

たとえば、User.id列のみを選択して、それをサブクエリで使用できるようにするには、次のようにします。

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

注:この.values()メソッドはクエリを実行し、反復可能な結果を​​返すため、機能しません(つまり、たとえば、EmailAddress.user_id.in_(admin_users.values(User.id))1つではなく2つのクエリを実行します)。

最初のクエリをに変更できることは知っていますがSession.query(User.id)、クエリによって返される列をどのように変更できるのか、特に疑問に思っています。

4

2 に答える 2

18

私はあなたの痛みを感じますvalues()。0.6.5で、繰り返しを行わないことを除いて、次with_entities()のように追加しました。values()

q = q.with_entities(User.id)
于 2012-05-21T13:44:43.800 に答える
2

Address.user_idを定義すると仮定すると、以下のクエリは演算子ForeignKeyと比較してより効率的にジョブを実行します。IN

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

ForeignKeyがない場合(必要ですが)、join条件を明示的に指定できます。

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

しかし、本当に演算子を使用してそれを実行したい場合はin_、ここに移動します(に注意してくださいsubquery):

subq = session.query(User.id).filter(User.is_admin==True).subquery()
admin_email_addresses = session.query(EmailAddress).\
       filter(EmailAddress.user_id.in_(subq)) 
于 2012-05-21T06:57:57.343 に答える