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))将执行两个查询,而不是一个)。

我知道我可以将第一个查询修改为Session.query(User.id),但我特别想知道如何修改查询返回的列。

4

2 回答 2

18

values()我感觉到你在这件事上的痛苦。在 0.6.5 中,我添加了with_entities()这就像values()except 不迭代:

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

假设您Address.user_id定义了 a 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 回答